【问题标题】:Do compilers in languages other than C/C++ have build-in sanitizing solutions?C/C++ 以外的其他语言的编译器是否有内置的清理解决方案?
【发布时间】:2021-11-21 05:47:09
【问题描述】:

GCC 和 LLVM 等 C/C++ 编译器集成了 AddressSanitizer 等清理技术。它们似乎对自动检测错误很有用。

我的问题是:其他语言的编译器是否也有内置的清理解决方案?如果没有,那为什么不呢?

【问题讨论】:

  • 在程序员犯错方面,很少有语言像 C 和 C++ 这样宽容。近几十年来它确实变得更好了,但仍然......
  • 换句话说,除了 C 和 C++ 之外的大多数语言都没有任何需要地址清理解决方案。以 Java 为例。

标签: compiler-construction address-sanitizer


【解决方案1】:

如果我正确理解您的问题,您正在寻找的错误检测器可以发现除了简单语法检查之外的错误,这些错误可能会导致不容易调试的错误。

Prolog 有一些谓词可以检测可能是错误的异常。

对于 SWI-Prolog,它们在 style_check/1 中组合在一起。样式检查包含在执行编译的make/0 命令中。

由于 Prolog 对大多数程序员来说是如此陌生,我将详细说明异常的一些含义。

  1. 单例 - 单例变量是在子句中仅出现一次的变量。
    这通常表明模型的高级概念是错误的,变量名称输入错误或存在 是不完整的代码。
    更多详情请见:Singleton variable checking
  2. no_effect - 编译器可以证明它们没有意义。
    由于 Prolog 是一种逻辑语言,因此可以基于逻辑证明一些代码。 Prolog 也有创建非逻辑代码的方法,但这是另一个讨论。
  3. var_branches - 验证是否在分支中引入变量并在分支之后使用,是否在所有分支中引入。
    由于在 Prolog 中使用 conditionals 有点棘手,它隐藏了一个 cut,因此必须格外小心逻辑是否正确。
  4. 不连续 - 如果谓词的子句不在同一个源文件中,则发出警告。
    在 Prolog 中,谓词(想想其他语言中的方法或函数)使用相同的名称和数量,并且通过自定义在代码中连续输入。当具有相同数量的谓词出现在代码的后面时,它因此是不连续的。这通常是未正确修改的复制和粘贴的结果,或者添加或删除了参数,现在有两个具有相同数量的谓词。
  5. charset - 警告原子和变量名称包含未引用的非 ASCII 字符。
    我不记得见过那个,但如果被发现肯定会是个大问题。

我认识的大多数经验丰富的 Prolog 程序员不会在不修复上述所有检查的情况下运行他们的代码。换句话说,他们很少给出误报。我不记得他们中的任何一个人都错了。

【讨论】:

    猜你喜欢
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2010-09-15
    • 2014-03-22
    相关资源
    最近更新 更多