标签: gcc-warning

为什么"函数名称"在C中评估为true,以及如何在其上发出警告

我最近偶然发现了以下gcc 3.2.2编写ac程序的行为:

在if语句中,我忘记了函数的大括号,并写道:

if(myFunc)... 代替 if(myFunc())...

虽然我几乎每个警告都打开了,但这并没有产生错误.

它只是评估为true.为什么这首写法律代码?因为函数存在/有地址?有谁知道如何避免这样的错误,或者是否有一个我忽略的警告选项?这个问题在以后的gcc版本中是否能更好地解决?

这里是完整性的确切编译器调用:

 msp430-gcc -g -Os -mmcu=msp430x1611 -Wall -W -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wwrite-strings -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations 
-Wredundant-decls -Wnested-externs -Wimplicit-function-declaration -Werror
Run Code Online (Sandbox Code Playgroud)

(因为我被迫使用gcc 3.2.3,所以没有-Wextra)

c gcc-warning

11
推荐指数
1
解决办法
8659
查看次数

为什么没有未使用的临时工具的gcc/g ++警告?

请考虑以下代码:

void ListenerImpl::attach(boost::shared_ptr<ISubscriber> subscriber)
{
    boost::unique_lock<boost::mutex>(mtx);
    subscribers.push_back(subscriber);
}

void ListenerImpl::notify(MsgPtr msg)
{
    boost::unique_lock<boost::mutex>(mtx);

    //notify all subscribers
    BOOST_FOREACH(boost::shared_ptr<ISubscriber> subscriber, subscribers){
        subscriber->update(msg);
    }

}
Run Code Online (Sandbox Code Playgroud)

(这是GoF中描述的观察者模式的实现.)这里的用户干预是保护attach()和notify()不同时运行,因此boost :: unique_lock.目标是保护subscribers容器.

但确实很难注意到锁实际上只是暂时的(仔细看,没有为它们指定名称).因此,当临时被破坏时,互斥锁上的锁定将被立即释放,即代码不是线程安全的.我希望在这种情况下编译器警告.像"未使用的临时"之类的东西.

更糟糕的是,cppcheck也不会认识到这个错误.(cppcheck:ac/c ++代码分析工具http://sourceforge.net/apps/mediawiki/cppcheck/index.php?title=Main_Page)

Gcc对未使用的变量发出警告.这里的临时变量是一个未使用的变量,绝对是程序员注意力不集中的结果.那么,为什么在这种情况下没有警告呢?发现这种情况可能太复杂了吗?

c++ thread-safety gcc-warning temporaries

11
推荐指数
1
解决办法
855
查看次数

如何禁用关于#warning指令作为GCC扩展的GCC警告?

当使用#warning指令时,而不是一个警告,我得到两个 - 我生成的一个,另外一个 warning: #warning is a GCC extension [enabled by default].

我可以用#抑制#warning指令的结果-Wno-cpp,但这与我想要的相反.

我可以通过使用来解决这个问题,#pragma message()但这似乎使#warning指令变得毫无意义 - 是否有办法抑制此警告警告?

gcc warnings compiler-warnings gcc-warning

11
推荐指数
1
解决办法
4474
查看次数

C++:需要警告:unsigned int i = -1;

我们的代码中有一个错误来自该行

unsigned int i = -1;
Run Code Online (Sandbox Code Playgroud)

当代码最初编写时,是i = 0,因此是正确的.使用-Wall -Wextra,我有点惊讶g​​cc没有在这里警告我因为-1不适合unsigned int.

只有当打开-Wsign-conversion这条线时才会成为警告 - 但是有许多误报.我正在使用第三方库,它使用signed int进行类似于数组的操作(尽管它们不能<0),所以每当我将它与例如vector混合时,我都会收到警告 - 而且我没有看到添加数百万的强制转换(甚至第三方标题会产生很多警告).所以这对我来说太多了警告.所有这些警告都是转换"可能会改变标志".这很好,因为我知道几乎在所有情况下都没有.

但是通过上面提到的任务,我得到了相同的"可能改变"警告.这不应该是"肯定会改变标志!" 而不是"可能改变"?是否有任何方法仅针对这些"将改变"的情况发出警告,而不是针对可能的情况?

c++ compiler-warnings gcc-warning

11
推荐指数
1
解决办法
396
查看次数

抑制"ISO C99要求使用休息参数"

考虑以下两个宏:

#define PNORM( v, s, ... )  { \
  if( VERBOSITY_CHECK( v ) ) { \
    if( ( errno = pthread_mutex_lock(&server.output_mutex) ) ) { \
      PERROR_LOCKFREE( normal, "\tpthread_mutex_lock failed on output_mutex.\r\n" ) ; \
    } \
    fprintf( stdout, s, ## __VA_ARGS__ ) ; \
    fflush( stdout ) ; \
    if( ( errno = pthread_mutex_unlock(&server.output_mutex) ) ) { \
      PERROR_LOCKFREE( normal, "\tpthread_mutex_unlock failed on output_mutex.\r\n" ) ; \
    } \
  } \
}

#define PERROR_LOCKFREE( v, s, ... ) { \ …
Run Code Online (Sandbox Code Playgroud)

c gcc posix variadic-functions gcc-warning

10
推荐指数
1
解决办法
1万
查看次数

GCC中枚举开关的控制流分析不足

在以下C++代码中:

typedef enum { a, b, c } Test;

int foo(Test test) {
    switch (test) {
        case a: return 0;
        case b: return 1;
        case c: return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译时发出警告-Wall,表示控件到达非void函数的结尾.为什么?


编辑

一般说来test示例中的变量可以包含任何值都是正确的.

foo(12354) 不编译:

> test.cpp:15:14: error: invalid conversion from ‘int’ to ‘Test’
> test.cpp:15:14: error:   initializing argument 1 of ‘int foo(Test)’

因为12354是不是一个有效的Test值(虽然它确实是明文有效Ç,但它不是在C++中).

你肯定可以显式地将任意整数常量强制转换为枚举类型,但是不是认为是未定义的行为吗?

c++ gcc gcc-warning control-flow

10
推荐指数
2
解决办法
1587
查看次数

什么是SWIG的警告503?

请解释SWIG的这些警告是什么以及如何避免它?

Warning 503: Can't wrap 'operator ()' unless renamed to a valid identifier.
Warning 503: Can't wrap 'operator =' unless renamed to a valid identifier.
Warning 503: Can't wrap 'operator *' unless renamed to a valid identifier.
Run Code Online (Sandbox Code Playgroud)

在Android NDK下编译SWIG生成的C++代码时会生成警告.

c++ swig gcc-warning android-ndk

10
推荐指数
1
解决办法
4150
查看次数

如何解决:C代码中"从不同大小的整数转换为指针"警告?

我正在从遗留代码中删除gcc警告.

是否可以通过类型转换来抑制警告"从不同大小的整数转换为指针":

example:

some_struct *ptr = func()  // func() returns an integer.
Run Code Online (Sandbox Code Playgroud)

有人可以指导我如何解决这样的gcc警告?

c pointers gcc-warning

10
推荐指数
2
解决办法
7万
查看次数

如何禁用gcc警告"cc1:warning:命令行选项'-std = c ++ 11'对C++/ObjC++有效,但对C无效[默认启用]"

我是cmake和gcc的新手.我在公司的新角色中的第一个任务是清理我的linux编译中的大部分错误,现在我看到的唯一警告是

cc1: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C [enabled by default]

我希望枯萎抑制警告或解决cmake文件中的问题.不幸的是,我还没有找到-Wno-xxx适合这里的正确陈述.

谢谢!

c gcc cmake gcc-warning

10
推荐指数
1
解决办法
1万
查看次数

从初始化列表转换为“A”将使用显式构造函数“A::A(int)”

我正在尝试将旧的 C++03 代码库迁移到 C++11。但我无法理解 gcc 在以下情况下警告我的内容:

\n
% g++ -std=c++03 t.cxx\n% g++ -std=c++11 t.cxx\nt.cxx: In function \xe2\x80\x98int main()\xe2\x80\x99:\nt.cxx:8:21: warning: converting to \xe2\x80\x98A\xe2\x80\x99 from initializer list would use explicit constructor \xe2\x80\x98A::A(int)\xe2\x80\x99\n    8 | int main() { B b = {}; }\n      |                     ^\nt.cxx:8:21: note: in C++11 and above a default constructor can be explicit\n
Run Code Online (Sandbox Code Playgroud)\n
struct A {\n  explicit A(int i = 42) {}\n};\nstruct B {\n  A a;\n};\n    \nint main() {\n  B b = {};\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我在这里想做的只是基本的零初始化。这对于 C++03 似乎是合法的,但我无法理解如何在 …

c++ gcc-warning c++11

10
推荐指数
1
解决办法
2537
查看次数