- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在一些遗留的源代码中有一行:
#define MAXMSG 1024
...
char m_recvBuf[MAXMSG];
unsigned int msgLength = ntohl(*((unsigned int *)m_recvBuf));
这会产生以下警告:
x.cpp: In member function ‘bool xx::cccc(std::string&)’:
x.cpp:308: warning: dereferencing type-punned pointer will break strict-aliasing rules
我怎样才能摆脱这个警告?
我的编译行:
g++ -c -g -O2 -Wall -DDEBUG_ON -D_VERSION_=\"1.0.0\" `xml2-config --cflags` -I../src -I./common -I. -I../../test/ -o common/xx.o common/xx.cpp
$ g++ --version
g++ (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3)
最佳答案
你的代码的问题是违反了strict aliasing rules因此它可能不安全。
您可以使用 -Wno-strict-aliasing
隐藏警告(这不会解决您的问题),修改您的数据结构或通过指定二进制文件的位置和长度来完全避免该问题按照 Matt 的建议进行复制(可能是最佳选择):
unsigned int msgLength;
memcpy(&msgLength, m_recvBuf, sizeof(msgLength));
msgLength = ntohl(msgLength);
注意:我没有在 -O3 中收到 clang 3.4 和 gcc 4.8.2 的错误,这意味着编译器可能已经优化了警告。无论如何,这并不能保证您的代码是安全的。
关于c++ - 将 char[] 转换为 unsigned int 得到 : dereferencing type-punned pointer will break strict-aliasing rules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25546335/
JavaScript 不关心字符串是双引号 "double" 还是单引号 'single'。 ECMAScript 5 严格模式的每个示例都通过双引号中的 "use strict" 启用。我可以执行以
这个问题在这里已经有了答案: What does "use strict" do in JavaScript, and what is the reasoning behind it? (30 个答
对于下面的代码片段 案例 1:严格模式 "use strict" let obj = { method: function(){ console.log(this); }, arr
function useStrict(){ "use strict"; } "use strict";
协议(protocol): http://opengraphprotocol.org/ 声明使用 带有 property 属性的标签. AFAIK,这不是有效的 XHTML 1.0 Strict 值。
我研究了一些库,它们似乎不包含文件或函数级别的 "use strict"; 行。因此,如果开发人员启用严格模式,那么我们如何知道库是否兼容?可能会有一些奇怪的功能或浏览器特定问题,这些问题在启用严格模
如果我们的 html 文件(导入外部 js 文件)已经有“use strict”,我们是否需要在外部 js 文件中加入“use strict”? 如果我们的外部 js 文件没有“use strict”
我相信这里的每个人都知道我们无法在不破坏 IE 兼容性的情况下为 XHTML 提供具有正确 MIME 类型 (application/xhtml+xml) 的页面,并且任何使用 text/html 提
我将这些定义放在一个文件中: x = 'a' : 'b' : 'c' : [] y = ['a', 'b', 'c'] (重要的是在文件中定义它们,而不是在 GHCi 中,因为在后一种情况下,事情变得
我想在 javascript 中使用 "use strict"; 模式,但在严格警告方面存在一些问题。我有一个“小部件”,例如: var Widget = function () { /* ... *
inline void addHeader(T value) { if(sizeof(T) > m_outputBufferStart) { std::clog <<
为什么 XHTML 1.0 Strict 显示的行高比 XHTML 1.0 Transitional 中相同值的行高显示得大? 因此,这将下推表格单元格中的内容(即 Firefox 中的 Hotmai
ECMAScript5中引入的严格模式,通过让JavaScript运行环境对一些开发过程中最常见和不易发现的错误做出和当前不同的处理,来让开发者拥有一个”更好”的JavaScript语言。很长一段时
I. Strict Mode阐述 根据 mysql5.0以上版本 strict mode (STRICT_TRANS_TABLES) 的限制: 1).不支持对not null字段插入null值
本文分享自华为云社区《JS/TS里的"use strict"严格模式是什么?》,作者: gentle_zhou。 在日常JS/TS项目开发过程中,经常会在文件开头看到"use strcit"字样,这里
在本教程中,您将借助示例了解 JavaScript 的“严格模式”语法。 在 JavaScript 中,‘use strict’; 声明代码应该在“严格模式”下执行。这使得编写良好且安全的 J
我在学习 JS 时遇到了“use strict”。然后,这里Should I 'use strict' for every single javascript function I write? @B
嗨我最近一直在使用下面的命令 Ffmpeg -i song.mp3 -loop 1 -i image.jpg -filter_complex \ "[0:a]showfreqs=mode=line:a
如果 use strict;,我有几行代码可以工作被注释掉了。但是,我不想仅仅因为一小部分而在整个脚本中禁用它。 我需要重新编码,或者以某种方式禁用 use strict;暂时,然后重新启用它。第一个
在 Angular 10 中,您可以使用 ng new --strict 创建一个新项目。 Enabling this flag initializes your new project with a
我是一名优秀的程序员,十分优秀!