首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

「我读」PL 观点 | 未定义行为有利的一面

PL Perspectives 是`ACM SIGPLAN`(编程语言特别兴趣小组[3])的博客。...然而,Unsafe 的内涵更加广泛:所有在 Rust 中产生未定义行为的代码是 Unsafe 的,并非所有 Unsafe 的代码都会产生 未定义行为。...比如我们解引用裸指针,就必须要放到 unsafe 块中,并不意味着,解引用裸指针就一定会产生未定义行为。...Unsafe不是一个错误;它是一个特性,没有它,Rust 就无法在实践中使系统编程更加安全。 提议:"未定义行为 "可能需要重新命名。...这个术语关注的是负面情况,而作为程序员或编译器作者,我们真正关心的是程序没有未定义行为。我们能摆脱这种双重否定吗?也许我们应该谈论 "确保定义良好的行为 "而不是 "避免未定义行为"。

1.6K30
您找到你想要的搜索结果了吗?
是的
没有找到

C 和 C++ 中的未定义行为

int main() { bool val; if (val) printf("TRUE"); else printf("FALSE"); } 程序3(...像 Java 这样的语言会在发现错误后立即捕获错误,但在少数情况下,像 C 和 C++ 这样的语言会继续以一种无声错误的方式执行代码,这可能会导致不可预测的结果。...了解未定义行为的重要性 如果用户开始在 C/C++ 环境中学习并且不清楚未定义行为的概念,那么这可能会在未来带来很多问题,比如调试其他人的代码实际上可能很难追踪未定义错误的根源。...未定义行为 风险和缺点 程序员有时依赖于未定义行为的特定实现(或编译器),这可能会在编译器更改/升级时导致问题。...例如,在大多数编译器中,最后一个程序生成 72 作为输出,但是基于此假设实现软件并不是一个好主意。  未定义的行为也可能导致安全漏洞,特别是由于未检查数组越界(导致缓冲区溢出攻击)的情况。

4.4K10

你可能不知道的字符比较中的“秘密”

然而,并不是所有代码点(code point)都已经在排序库中进行了定义。它们可能被未定义的原因是: 代码点在Unicode标准中未进行定义。...同理,如果你创建一张未定义字符为表名的表,然后尝试创建另一个未定义字符为表名的表,第二张表会因为表名重复而创建失败,即使这两个未定义字符的代码点是不同的。...虽然这些结果似乎令人迷惑不解,基本规则其实很简单。即未定义字符和字符串的比较将被忽略。一旦你明白并记住这个规则,这个行为就很容易理解了。 只要有未定义字符的参数将被忽略。...在二进制排序规则中,比较完全是根据代码点,不是语言规则,因此也没有所谓的已定义和未定义的概念了。(完) 读完这篇博客,你应该明白怎么回事了吧。...Figure-3: 在Latin1_General_BIN排序规则下的比较 不难推导出,在二进制排序规则下的数据库中,默认下,这两个字符是不相等的。 ?

1.1K70

先别急着“用Rust重写”,可能没有说的那么安全

上面的描述是不是感觉有些熟悉?没错,最近一段时间,“用 Rust 重写”正在以传销般的方式席卷整个开发领域。...更要命的是,哪怕是精通 Rust 和 Modula 3 系统架构的开发者,也几乎无法回避这些麻烦。...时间安全:(2)和(3)可能因不正确的函数参数或重复函数调用而导致 use-after-free 和 double-fee 错误。...请注意,跨 FFI 边界的展示会被认定为未定义行为。 尽管目前 Rust 社区还存在争论, FFI 确实应明确处理恐慌(panic)以保证异常安全——理想情况下,应将故障告知调用方。...然而,如果相应的编译器不是以相同的方式打包函数输入,则跨语言函数调用可能会引发未定义行为。

35630

javaScript中is-not-defined,undefined和null的区别

is not defined与undefined 之前没太注意is not defined和undefined有什么区别,每次都是简单的把两者理解为未定义,现在回过头来梳理js基础的时候才发现其中区别还是很鲜明的...先从单纯的字面意思来理解一下(有道词典): is not defined: 未定义 not defined: 未定义,没有定义,无法定义 && undefined: 不明确的 单从字面意思大体也能看出两者的区别...undefined 一个定义了但未赋值的 变量 demo2: 123 var aconsole.log(a) // 未报错,提示: undefined 一个定义了把值赋为undefined的 变量...demo3: 1234 var p = 1p = undefinedconsole.log(p) // 未报错,提示: undefined 一个对象没有赋值的属性 demo4: 12 console.log...is false 用法的不同 虽然null和undefined基本是同义的,但是在用法上还是有一些细微的差别的 null null表示“没有对象”,即此处不该有值 作为函数的参数,表示该函数的参数不是对象

1.2K20

C++求值顺序

3.C++手册 几乎所有 C++ 运算符的求值顺序(包括函数调用表达式中的函数参数求值顺序和任何表达式中子表达式的求值顺序)都是未指定的。...例子: 表达式 f1() + f2() + f3() 由于 operator+ 的从左到右结合性分析为 (f1() + f2()) + f3() ,运行时对 f3 的函数调用可能首先、最后,...3) 复制函数返回值后,和函数外任何语句的执行前有一个序列点。 4) 一旦函数执行开始,则在被调用函数完成前,不求值来自调用方函数的表达式(函数不能交错)。...i = ++i + i++; // 未定义行为 i = i++ + 1; // 未定义行为( C++17 前) i = ++i + 1; // 未定义行为( C++11 前) ++ ++i; // 未定义行为...若以任何其他方式访问,则行为未定义。 cout << i << i++; // 未定义行为( C++17 前) a[i] = i++; // 未定义行为( C++17 前)

1.3K20

PHP中的那些魔术方法(一)

它们俩的作用其实差不多,都是用于未定义的方法,当使用这些未定义的方法时就会进入这两个函数中。...比如说我们调用$a->b();这个方法,其实在$a的类模板中并没有b()方法,这时就会进入__call()方法进行处理。...函数重载其实就是同名的函数,参数或返回值不同,在Java等强类型语言中可以方便的实现,PHP是弱类型语言,无法准确的定位方法的重载,使用__call()方法其实也需要很多的判断,并不是非常的推荐一定要和...注意,这里并不是指没有定义的属性,如果定义为private的属性也可以通过这两个魔术方法来进行定义,当然,也包括未定义的属性。这两个属性其实可以对应Java中对于Java Bean的属性封装。...在下一篇中将会介绍其它一些出现频率较低更有意思的魔术方法。

97620

【JavaScript】解决 JavaScript 语言报错:Uncaught TypeError: Cannot read property ‘X‘ of undefined

3....name); // 不会抛出错误,输出 undefined 3. 函数返回值检查 确保函数的返回值是已定义的对象。如果函数可能返回未定义的值,可以在调用后检查返回值。...theme); // undefined 示例 3:函数返回值处理 // 错误代码 function getConfig() { return undefined; } let config = getConfig...found'); } 六、总结 “Uncaught TypeError: Cannot read property ‘X’ of undefined” 错误在 JavaScript 开发中非常普遍,通过了解其成因并采用适当的编码实践...可选链操作符:在访问嵌套对象属性时,使用可选链操作符可以避免未定义错误。 函数返回值检查:在使用函数返回值时,先检查其是否为未定义

99250

【C语言】解决C语言报错:Undefined Reference

简介 Undefined Reference(未定义引用)是C语言编译过程中常见的错误之一,通常在链接阶段出现。当编译器无法找到函数或变量的定义时,会报告未定义引用错误。...如果链接器找不到某个引用的符号的定义,就会产生未定义引用错误。 Undefined Reference的常见原因 缺少函数定义:调用了未定义的函数。...,导致未定义引用错误 return 0; } 分析与解决: 此例中,my_function函数未定义,导致未定义引用错误。...printf("Function called with %d\n", a); } int main() { my_function(5); // 函数调用 return 0; } 示例3:...return 0; } 分析与解决: 此例中,mylib_function函数在mylib库中定义,编译时未链接该库,导致未定义引用错误。

36720

同样是空值,null和undefined有什么异同?

如果定义的变量准备在将来用于保存对象,最好将该变量初始化为 null,而不是其他值.这样一来,只要直接检查null值就知道相应的变量是否已经保存了一个对象的引用。 if(car!...未定义的变量和定义但未初始化的变量的类型都是 undefined, let c; //未初始化 //d d未定义 console.log(typeof(c));//undefined console.log...(typeof(d));//undefined console.log(c);//undefined console.log(d);//出错 即便未初始化的变量会被自动赋予undefind值,显式的初始化变量依然是更好的选择和习惯...,如果能做到这一点,那么当typeof返回 undefined 时,我们就知道被检测的变量还没有被声明(即不存在),而不是尚未初化。...let e = null; //f不存在 console.log(typeof(e));//object console.log(typeof(f));//undefined 3.null和undfined

90711

每天学点JavaScript基础(1)—— null 和 undefined

如果定义的变量准备在将来用于保存对象,最好将该变量初始化为 null,而不是其他值.这样一来,只要直接检查null值就知道相应的变量是否已经保存了一个对象的引用。 if(car!...未定义的变量和定义但未初始化的变量的类型都是 undefined, let c; //未初始化 //d d未定义 console.log(typeof(c));//undefined console.log...(typeof(d));//undefined console.log(c);//undefined console.log(d);//出错 即便未初始化的变量会被自动赋予undefind值,显式的初始化变量依然是更好的选择和习惯...,如果能做到这一点,那么当typeof返回 undefined 时,我们就知道被检测的变量还没有被声明(即不存在),而不是尚未初化。...let e = null; //f不存在 console.log(typeof(e));//object console.log(typeof(f));//undefined 3.null和undfined

64120

严格别名规则“-fstrict-aliasing”和“-fno-strict-aliasing”及类型双关

“-fstrict-aliasing”表示启用严格别名规则,“-fno-strict-aliasing”表示禁用严格别名规则,当gcc的编译优化参数为“-O2”、“-O3”和“-Os”时,默认会打开...这里“&m”、“p1”、“p2”和“p3”均是同一内存地址的别名,n不是,因此涉及严格别名,是和指针相关的。...下列代码,如果使用“-O2”、“-O3”或“-Os”编译,并且加不“-fno-strict-aliasing”,则“*s”的结果是未定义的,不同的编译器可能产生不同的结果,即使同一编译器也可能运行时结果不尽相同...}; int main() { X x; x.m = 0x12345678; short* s = &x.s; printf("%x\n", *s); return 0; } 下列代码的结果也是未定义的...(多版本gcc实测也正常,同样未有编译告警,gcc手册指出结果是未定义的): #include union X { int m; short s; }; int main() { int m = 0x12345678

1.9K30

SD NAND存储功能描述(8)专用命令CMD55 56

例如,如果一张卡有ACMD13的定义,没有ACMD7的定义,则APP_CMD后的命令13被解释为非规则CMD13,而APP CMD后的CMD7被解释为规则CMD7。...当在CMD55之后直接发出多个命令时(CMD55除外),第一个命令解释为ACMD,后面的命令解释为普通命令(3)如果发送了已定义的ACMD并且是合法的,则响应设置了APP CMD位,表明接受的命令被解释为...在上述解释中,在详细命令描述部分中定义的命令是“已定义”命令,而在该部分中未定义的命令是“未定义”命令。...两者的区别在于参数表示数据传输的方向(而不是地址),数据块不是内存有效负载数据,而是具有特定于供应商的格式和含义。在发送CMD56之前,需要选中卡片(“tran_state”)。...(3)驾驶员强度在UHS-I模式中选择合适的输出驱动器强度取决于主机环境。(4)限流选择在UHS-I模式下限制卡的最大电流取决于主机的供电能力和放热能力。这是在物理层规范版本1.10中引入的。

11310
领券