我最近偶然发现了以下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)
请考虑以下代码:
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对未使用的变量发出警告.这里的临时变量是一个未使用的变量,绝对是程序员注意力不集中的结果.那么,为什么在这种情况下没有警告呢?发现这种情况可能太复杂了吗?
当使用#warning指令时,而不是一个警告,我得到两个 - 我生成的一个,另外一个
warning: #warning is a GCC extension [enabled by default].
我可以用#抑制#warning指令的结果-Wno-cpp,但这与我想要的相反.
我可以通过使用来解决这个问题,#pragma message()但这似乎使#warning指令变得毫无意义 - 是否有办法抑制此警告警告?
我们的代码中有一个错误来自该行
unsigned int i = -1;
Run Code Online (Sandbox Code Playgroud)
当代码最初编写时,是i = 0,因此是正确的.使用-Wall -Wextra,我有点惊讶gcc没有在这里警告我因为-1不适合unsigned int.
只有当打开-Wsign-conversion这条线时才会成为警告 - 但是有许多误报.我正在使用第三方库,它使用signed int进行类似于数组的操作(尽管它们不能<0),所以每当我将它与例如vector混合时,我都会收到警告 - 而且我没有看到添加数百万的强制转换(甚至第三方标题会产生很多警告).所以这对我来说太多了警告.所有这些警告都是转换"可能会改变标志".这很好,因为我知道几乎在所有情况下都没有.
但是通过上面提到的任务,我得到了相同的"可能改变"警告.这不应该是"肯定会改变标志!" 而不是"可能改变"?是否有任何方法仅针对这些"将改变"的情况发出警告,而不是针对可能的情况?
考虑以下两个宏:
#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++代码中:
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++中).
你肯定可以显式地将任意整数常量强制转换为枚举类型,但是不是认为是未定义的行为吗?
请解释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++代码时会生成警告.
我正在从遗留代码中删除gcc警告.
是否可以通过类型转换来抑制警告"从不同大小的整数转换为指针":
example:
some_struct *ptr = func() // func() returns an integer.
Run Code Online (Sandbox Code Playgroud)
有人可以指导我如何解决这样的gcc警告?
我是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++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\nRun Code Online (Sandbox Code Playgroud)\nstruct A {\n explicit A(int i = 42) {}\n};\nstruct B {\n A a;\n};\n \nint main() {\n B b = {};\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n我在这里想做的只是基本的零初始化。这对于 C++03 似乎是合法的,但我无法理解如何在 …
gcc-warning ×10
c++ ×5
c ×4
gcc ×4
android-ndk ×1
c++11 ×1
cmake ×1
control-flow ×1
pointers ×1
posix ×1
swig ×1
temporaries ×1
warnings ×1