使用'-Wcast-qual'选项检查编译

时间:2015-06-21 09:52:24

标签: c gcc

我正在阅读an introduction to gcc,其中说:

  

' - Wcast-qual'这个选项会警告要删除的指针   一个类型限定符,例如const。例如,以下功能   从输入参数中丢弃const限定符,允许它   被覆盖:

 void
       f (const char * str)
       {
         char * s = (char *)str;
         s[0] = ’\0’; }
     

修改str的原始内容是违反它的   const属性。这个选项会警告不正当演员   变量str,允许修改字符串。

我试图重复这一点,期待一个警告,但在编译时没有警告。我的代码如下:

#include <stdio.h>

void f(const char * str);

int main() {
    char Str = 'a';
    char * myStr;
    myStr = & Str;
    printf ("result: %c \n", * myStr);
    f(myStr);
    printf ("result: %c \n", * myStr);
    return 0;
}


void
f (const char * str)
{
  char * s = (char *)str;
  s[0] = '\0';
}

命令是:gcc -Wcast-qual castqual.c

有人可以解释这种不一致吗?

1 个答案:

答案 0 :(得分:1)

根据评论,事实证明OP正在使用mac,其中gcc作为命令是clang的包装器 - 基于llvm的编译器。

正在使用的clang版本接受该选项但不对其执行任何操作。正在添加对警告的支持,并且应该出现在XCode 7 / clang 7时间范围内;但问题是gcc而不是clang

在这种情况下,您需要手动或使用包管理器(例如homebrewmacports)安装适当的gcc副本。一旦你安装了gcc,就可以使用它,例如gcc-4.8gcc-5等(取决于包管理器)。如果要使用实际gcc编译代码,请使用:gcc-4.8 -Wcast-qual testcode.c。如果你正在使用autoconf工具,你可以使用export CC=gcc-4.8; export CXX=g++-4.8等,然后包将选择该编译器。

确认您正在呼叫gcc而不是clang,需要检查gcc --version的输出。在clang包装器上,您会看到以下内容:

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix

而在实际的gcc实例中,您会看到:

$ gcc-5 --version
gcc-5 (Homebrew gcc 5.1.0) 5.1.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  

imho:您可以对名为gcc-4.8的特定gcc创建一个符号链接,并让它直接调用,但它可以破坏其他内容。