违反shall/shall not要求的诊断要求是否和其所在标准章节有关
标准中shall/shall not要求违反后的处理规则说明
以下结论基于ISO C/C++系列编程语言标准的通用约定,其他领域标准可参考对应文档的自定义规则:
- 针对第一个问题:违反shall/shall not要求的后续处理规则确实和要求所在的标准章节直接相关
标准里的「约束(Constraints)」是特殊的前置限定章节,所有归入该章节的shall/shall not规则,都是编译期可校验的语法、语义限制,标准对这类规则的违反有统一的强制处理要求。而语义章节、运行时行为描述章节的shall/shall not规则,大多涉及只有运行时才能确定的状态,或者属于标准留给实现自由处理的范畴,处理规则和约束章节完全不同。 - 针对第二个问题:违反位于语义章节的shall/shall not要求时,标准没有强制要求实现出具诊断信息
这类规则的违反统一归类为「未定义行为」,实现可以选择任意处理逻辑:编译期直接报错、输出警告、生成可执行代码、甚至直接终止编译都符合标准要求,是否输出诊断完全由实现自行决定。比如语义章节规定的「指针解引用操作的目标必须是合法内存地址」,大部分场景下编译器编译期无法确定指针运行时的实际指向,自然也不会强制输出诊断。
补充说明:部分厂商的实现会主动对部分语义层的shall违反做静态校验,输出警告或错误提示,但这属于实现的扩展优化,不是符合标准的必要条件。
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

