【发布时间】:2016-08-03 16:45:01
【问题描述】:
我正在使用-Werror 进行编译,发现一个警告翻译为错误:
1> cc1plus.exe: warnings being treated as errors
1> c:\rtems-4.9\bin\../lib/gcc/powerpc-rtems4.9/4.3.2/include/c++/bits/stl_vector.h: In function 'int someFunc()':
1> D:\Git\Error_Parsing_script\Src\Plus\RTEMS_proj\c:\rtems-4.9\bin\..\lib\gcc\powerpc-rtems4.9\4.3.2\include\c++\bits\stl_vector.h(1043,1) : error: array subscript is above array bounds
从此代码:
struct ControllerConfigDataType1 {
char name[50];
int controllerType;
};
int someFunc()
{
std::vector<char> reply;
reply.reserve(255);
ControllerConfigDataType1 response = { { 0 } };
reply.insert(reply.end(), reinterpret_cast<char*>(&response), reinterpret_cast<char*>(&response) + sizeof(response));
return 0;
}
据我所知,this code is completely valid。一件奇怪的事情是,如果我手动将 sizeof(resonse) 设置为 response 中的char name[50] 数组的边界,我想从我的指针取消引用reinterpret_cast<char*>(&response) + sizeof(response) 来看这是有道理的。
知道ControllerConfigDataType1的格式不能改变,有没有办法满足编译器对这一行的保留?
请注意,这是在 RTEMS 4.9.2 的旧编译器上(请参阅下面的详细信息),这可能意味着此警告不会出现在 GCC 的更新版本中(并且不会出现在 Visual C++ 的VS2015)。
其他信息
错误中提到了stl_vector.h(1043,1),这是std::vector::insert函数的实现:
// Called by the range insert to implement [23.1.1]/9
template<typename _InputIterator>
void
_M_insert_dispatch(iterator __pos, _InputIterator __first,
_InputIterator __last, __false_type)
{
typedef typename std::iterator_traits<_InputIterator>::
iterator_category _IterCategory;
_M_range_insert(__pos, __first, __last, _IterCategory());
}
从库中检索到的缩进
请注意,编译器由RTEMS 4.9.2 提供,并具有以下版本信息:
Thread model: rtems
gcc version 4.3.2 (GCC)
【问题讨论】:
-
每当我在代码审查中看到
reinterpret_cast时,我都会开始寻找错误(特别小心)(除了演员表本身)——通常会有一些.. 只是说。 -
"gcc 版本 4.3.2" - 这很旧。与您的问题完全无关,但您是否考虑过使用更现代的编译器(和 C++ 语言版本)?
-
@JesperJuhl 1. 是的,但这是必要的,我们一直非常小心。 2.我们不能,它与操作系统相关,并且操作系统更新将是一个6个月 - 1年的项目,没有资源。
-
Downvoter,解释我可以改进什么的评论会很有帮助,这真的是一个糟糕的问题吗?
标签: c++ visual-studio gcc visual-studio-2015