- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用警告级别为 -Wall -Wextra
的 g++并将警告视为错误 ( -Werror
)。
现在我有时会收到错误消息“变量 可能在此函数中未初始化地使用”。
“有时”是指我有两个独立的编译单元,它们都包含相同的头文件。一个编译单元编译没有错误,另一个给出上述错误。
头文件中的相关代码如下。由于函数很长,我只复制了下面的相关部分。
准确的错误是:
'cmpres' may be used uninitialized in this function
我用 *
标记了错误行下面。
for (; ;) {
int cmpres; // *
while (b <= c and (cmpres = cmp(b, pivot)) <= 0) {
if (cmpres == 0)
::std::iter_swap(a++, b);
++b;
}
while (c >= b and (cmpres = cmp(c, pivot)) >= 0) {
if (cmpres == 0)
::std::iter_swap(d--, c);
--c;
}
if (b > c) break;
::std::iter_swap(b++, c--);
}
( cmp
是一个仿函数,它接受两个指针 x
和 y
,如果 *x < *y
、*x == *y
或 *x > *y
分别返回 –1、0 或 +1。其他变量是指向同一个数组。)
这段代码是一个更大函数的一部分,但是变量 cmpres
没有在其他地方使用。因此我不明白为什么会生成此警告。此外,编译器显然理解 cmpres
永远不会被读取为未初始化的(或者至少,它并不总是警告,见上文)。
现在我有两个问题:
为什么不一致的行为?这个警告是由启发式生成的吗? (这是有道理的,因为发出此警告需要进行控制流分析,这在一般情况下是 NP 困难的,并且不能总是执行。)
为什么会出现警告?我的代码不安全吗?我开始欣赏这个特别的警告,因为它使我免于在其他情况下很难检测到错误 - 所以这个是一个有效的警告,至少有时是这样。在这里有效吗?
最佳答案
诊断未初始化变量且没有漏报或漏报的算法必须(作为子例程)包含解决 Halting Problem 问题的算法。 .这意味着没有这样的算法。计算机 不可能 100% 地做到这一点。
我不知道 GCC 的未初始化变量分析究竟是如何工作的,但我知道它对早期优化过程对代码所做的事情非常敏感。所以我一点也不惊讶你只是有时会得到误报。它确实区分了确定的情况和不能确定的情况 --
int foo() { int a; return a; }
产生“警告:‘a’是在此函数中使用未初始化”(强调我的)。
编辑:我发现一个案例,最新版本的 GCC(4.3 及更高版本)无法诊断未初始化的变量:
int foo(int x)
{
int a;
return x ? a : 0;
}
早期的优化注意到,如果 x
不为零,则函数的行为未定义,因此它们假设 x
必须为零 并替换整个带有“return 0;
”的函数主体 这发生在生成使用未初始化警告的传递之前,因此没有诊断。参见 GCC bug 18501血淋淋的细节。
我提出这个问题的部分原因是为了证明生产级编译器可能会以两种方式错误地诊断未初始化变量,部分原因是这是一个很好的例子,说明未定义的行为可以在执行时向后传播。测试 x
没有任何未定义的内容,但是由于依赖于 x
的代码控制具有未定义的行为,允许编译器假定控制依赖性永远不会满足并丢弃测试.
关于c++ - g++ 编译器中的 “Uninitialized use” 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4913254/
我想问一个让我困惑的问题。我正在尝试扫描字符串并将其转换为实数。使用该数字来计算值(value)。这是我的代码: string input_file_name1 = "shen_test_38_30_
我正在为我的 C 类入门编写一个程序,当我尝试使用 gcc 进行编译时,我不断收到一些警告。 这是我的代码: char **outList; *outList = strdup(cloudDevice
我正在使用 Chromium 嵌入式框架。我将以下内容放在主函数中。 CefRefPtr cef; CefRequest::ReferrerPolicy origin = origin; cef->S
我是C++的新手,正在测试while循环以及C++的绝对速度及其对我的CPU的影响,但出现以下错误: Severity Code Description Project File Line Suppr
string foo; try { foo = "test"; // yeah, i know ... } catch // yeah, i know this one too :) {
当尝试在 Mac OS X 10.6 上使用 FFMPEG gem 时,ruby 会抛出一个 NameError 异常,如下所示: NameError: uninitialized constant
我做了一个程序来计算 View 的总宽度/高度(有时我想要总宽度,有时我想要总高度)。唯一的问题是:如果我正在计算宽度,我想添加一个额外的 10到总数。这是我当前的代码: func calculate
所以我只想从常规地址(字符串)中提取经度/纬度坐标。我查阅了 geokit gem 文档并按照记录的内容进行了操作,但我不断收到此错误:“NameError:未初始化的常量 Geokit::Geoco
为什么 perl -we '$c = $c+3' 上升 Use of uninitialized value $c in addition (+) at -e line 1. perl -we '$c
我有以下代码: class circularList { public: circularList() : data(0), next(this) {} public: int dat
我的情况 我正在 ASP.NET MVC4 应用程序中进行测试。我正在开发的应用程序部分将现代 WebSecurity/SimpleMembershipProvider 与正在逐步淘汰的遗留身份验证系
我是 Ruby on Rails 的新手,我想使用迁移生成 mysql 数据库。 我尝试过这个命令 ruby bin/rake db:drop db:create db:migrate --trace
我需要一些调试帮助,因为我遇到的错误真的很难。 这是一款具有复杂动画的游戏。然而,问题不在于 SpriteKit .我希望动画按照严格的顺序彼此跟随,所以我实现了 Operation 的子类: cla
这是一个示例代码: #include int main() { int n = 5; float v[n]; float sum; int i; for(i
我正在使用 SQL Server 2012 并尝试实现事务复制。我正在使用系统存储过程来创建发布和订阅。我成功地创建了这些东西,但是当我检查复制监视器时,它显示“未初始化的订阅”。 当我检查订阅的同步
我有以下脚本: use 5.12.4; use strict; use warnings; say "Enter a functionality:"; while (<>) { if (/ad
我已经阅读了有关 has_many 的文档和大量教程:通过 Rails 中的关系,但我终生无法掌握它的窍门。 我正在尝试向我的 current_user(devise) 添加一个组,并且我在 Grou
我正在尝试为移动 API 设置路由,它应该有一个版本化的 api-path。我已经可以让移动 Auth 工作了,这是在位于 的单独 Controller AuthController 中实现的。/co
我正在使用 luacheck(在 Atom 编辑器中),但对其他静态分析工具开放。 有没有办法检查我是否使用了未初始化的表字段?我阅读了文档( http://luacheck.readthedocs.
我有一家工厂,例如: FactoryGirl.define do factory :page do title 'Fake Title For Page' end end 并进行测试:
我是一名优秀的程序员,十分优秀!