【问题标题】:Eclipse indexer shows false-positive semantic errorsEclipse 索引器显示误报语义错误
【发布时间】:2016-06-15 16:14:28
【问题描述】:

我最近更新到 Eclipse Mars.2(版本 4.5.2)并将我的项目切换到 C++11 开发(是的,是时候了!)。

我已设法配置我的所有 Makefile 以正确构建(即没有明显的错误或警告),但 Eclipse 内置索引器报告了几个误报语义错误。并非所有这些都与 C++11 的特定功能有关。

我指的是已经存在的线程 [1][2],它们较旧,并没有为我带来任何真正的解决方案。

误报示例

std::next(..) 无法识别 - 但我对 std::begin()std::end() 没有任何问题:

std::vector<int> v;
for (auto i = std::begin(v); i != std::end(v); i++)
{
  std::next(i);
}

无效参数' 候选人是: #0 下一个(#0,std::iterator_traits::difference_type) 语义错误

std::string::substr(..) 无法识别:

std::string myString = "test";
myString.substr(0, 1);

无效参数' 候选人是: std::basic_string,std::allocator> substr(?, ?) 语义错误

无法识别 googletest 的 ASSERT_EQ 宏(但是,其他断言有效!):

std::string expValue = "test";
std::string actValue = "test";
ASSERT_EQ(expValue, actValue);

函数“比较”无法解析
语义错误


我已经测试了各种项目设置,得出的结论是它与 Eclipse 项目的“路径和符号”设置以及“预处理器包含路径、宏等”有关。设置。尤其是 Providers 的顺序对任何变化都非常敏感。

另一个问题是我有一个带有 gcc 4.4.4 编译器的旧系统(/usr/bin/gcc 中的默认值)和一个额外的 gcc 4.8.2 安装在 /opt/... 中,它实际上应该用于编译。这也意味着我有两组头文件,但只有一组包含 C++11 特性。

我当前的配置是这样的(如项目设置 -> C/C++ 常规 -> 预处理器包括路径 -> 条目中所示):

  • CDT 用户设置条目
    • gcc 4.8.2 的系统头文件(视为内置)
    • 预处理宏__cplusplus = 201103L
  • CDT 托管构建设置条目
    • 自定义包含和库路径的路径
  • CDT GCC 构建输出解析器
  • CDT GCC 内置编译器设置
    • gcc 4.4.4 的系统头文件不可更改
    • 本地包括

我也尝试过其他组合,但这个组合的误报率最低。


索引器已启用项目特定设置。到目前为止,我还没有找到任何可以使错误消失的开关。


有没有人也遇到过这样的问题?是我的路径和符号的配置问题还是 Eclipse 索引器中的错误?

【问题讨论】:

  • 您确定这是索引器而不是code analyzer?我刚刚关闭了code analyzer,编译器在指出此类错误方面做得很好。
  • 另外,您的用户设置似乎很奇怪。也许这将有助于配置 C++11 stackoverflow.com/questions/17131744/…
  • @Galik:像在提到的线程中那样配置提供程序意味着我必须将我引用的库头放在“CDT 用户设置条目”中。我试过了,但在重建索引后,它会导致完全相同的情况:相同的函数调用被标记为错误。
  • @Galik 禁用code analyzer 设置中的语义错误确实消除了误报错误标记!但是,我认为这只会隐藏实际问题(Eclipse 中的错误或我的项目设置中的错误配置)。

标签: c++ eclipse c++11 gcc eclipse-cdt


【解决方案1】:

std::next(i); 不正确。当你使用

for (auto i : v)
{
    std::next(i);
}

i 变为 *(v.begin()) 类型,在您的代码中是 intstd::next 需要一个迭代器,并且该迭代器还必须提供一个 difference_type 类型。

基于范围的 for 循环的全部目的是不必担心在容器中前进。如果您想从向量中打印出所有内容,您只需使用

for (auto i : v)
{
    std::cout << i << " ";
}

我知道这并不能解决您的其他错误,但可以解决第一个错误

【讨论】:

  • 是的,你是对的。我试图展示我的代码不起作用的简化示例。我简化太多了!我修复了我的示例。它们现在与我的项目代码一起编译,没有任何错误或警告。 Eclipse 仍然显示错误。
【解决方案2】:

我将 Eclipse CDT 更新到版本 8.8.1,并且误报编译错误不再出现。所以毕竟这是一个软件错误。

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 2013-03-14
    • 2018-08-29
    • 2013-09-26
    • 2014-08-01
    • 2016-02-18
    • 2013-06-25
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多