【发布时间】:2016-01-01 15:25:20
【问题描述】:
如果一个表达式的求值导致 C 中未定义的行为,并且该表达式总是在程序执行时求值(例如,如果它出现在 main 的开头),如果实现拒绝它,它是否符合编译时间? C语言中编译/翻译程序和执行程序有区别吗?
我知道有 C 语言的解释器。C 标准如何处理这种差异?
示例(读取未初始化的本地)
int main() { int i; return i; }
当运行它时,在执行的任何阶段(甚至在调用main 之前),程序都可以做一些有趣的事情。但是当我们甚至没有尝试运行它时,也会发生一些有趣的事情吗?它会导致编译器本身的缓冲区溢出吗?
【问题讨论】:
-
就我而言,允许编译器在编译时静态拒绝未定义的行为——毕竟,语法错误是未定义的行为。
-
如果没有这种表达的例子,这个问题似乎有点宽泛和模糊。
-
您已在评论中回复了有关该问题的观点。最好用例子来改进问题。
-
未定义是,嗯,未定义。这是否意味着,正确地说,该标准甚至没有解决在这些情况下会发生什么?也许拒绝编译器是鼻恶魔可以采取的一种形式
-
@FUZxxl:不,语法错误明确不是未定义的行为。语法错误需要诊断。未定义的行为不需要诊断。
标签: c language-lawyer