SGM*_*GM1 11 c c++ java syntax semantics
我在家庭作业上有这个问题(不用担心,已经完成):
[使用您最喜欢的命令式语言,给出每个...的示例]编译器既无法捕获也无法轻松生成要捕获的代码的错误(这应该违反语言定义,而不仅仅是程序错误)
来自"编程语言语用学"(第3版)Michael L. Scott
我的回答,称main从main通过传递相同的参数(在C和Java),灵感来自此.但我个人觉得这只是一个语义错误.
对我来说,这个问题是在询问如何产生一个既不是语法也不是语义的错误,坦率地说,我无法想到它不会陷入其中的情况.
是否容易被利用的代码,如缓冲区溢出(以及我从未听说过的其他利用)?某种坑从语言结构中掉落(IDK,但懒惰的评估/弱类型检查)?我想在Java/C++/C中使用一个简单的例子,但欢迎其他例子.
我想到了未定义的行为.调用UB的语句在语法和语义上都不正确,但是代码的结果无法预测并被认为是错误的.
一个例子是(来自维基百科页面)尝试修改字符串常量:
char * str = "Hello world!";
str[0] = 'h'; // undefined-behaviour here
Run Code Online (Sandbox Code Playgroud)
然而,并非所有UB语句都如此容易识别.例如,如果用户输入的数字太大,请考虑签名整数溢出的可能性:
// get number from user
char input[100];
fgets(input, sizeof input, stdin);
int number = strtol(input, NULL, 10);
// print its square: possible integer-overflow if number * number > INT_MAX
printf("%i^2 = %i\n", number, number * number);
Run Code Online (Sandbox Code Playgroud)
这里可能不一定有符号整数溢出.并且由于它涉及用户输入,因此无法在编译或链接时检测到它.
调用未定义行为1的语句在语义上和语法上都是正确的,但使程序行为不规律.
a[i++] = i; // Syntax (symbolic representation) and semantic (meaning) both are correct. But invokes UB.
Run Code Online (Sandbox Code Playgroud)
另一个例子是使用指针而不初始化它.
逻辑错误既不是语义错误也不是语法错误.
1. 未定义的行为:任何事情都可能发生; 标准没有要求.程序可能无法编译,或者可能无法正确执行(崩溃或静默生成不正确的结果),或者它偶然可能完全符合程序员的意图.
| 归档时间: |
|
| 查看次数: |
1743 次 |
| 最近记录: |