- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当我在 Visual Studio 2015 中遇到 [Analyze -> Run Code Analysis] 引发的一些有趣问题时,我正尝试在 C 中实现合并排序。
代码如下:
void MergeSort_r(int A[], int n)
{
// A = {1, 3, 2}
// n = 3
int rightCount;
int* R;
if ( n < 2 ) return;
// version 1: rightCount = 2
rightCount = n - (n/2);
// version 2: rightCount = 2
rightCount = n - 1;
R = ( int* ) malloc( rightCount * sizeof( int ) );
if ( R ) {
for ( int i = 0; i < rightCount; i++ ) {
R[i] = A[i];
}
free( R );
}
}
即使 rightCount 的两个版本基本上都计算为 2,但在第一个版本中,我收到警告:
"Buffer overrun while writing to 'R': the writable size is '(unsigned int)rightCount*sizeof(int)' bytes, but '8' bytes might be written."
知道为什么会这样吗?期待听到您的回答。
最佳答案
Visual C++ 代码分析工具集可能并不总是提供最好的警告。它试图为您提供最好的一组警告,以修复一些可能在运行时出现的潜在问题/错误。您有几个选择:
#pragma
指令禁用代码周围的给定警告。new
、make_unique
等理想情况下,您应该始终使用较新的智能指针原语,如 unique_ptr
、shared_ptr
等。它们不仅为您分配内存,而且会在调用堆栈中抛出的任何异常时释放内存。您根本不需要输入 *
!
auto buffer = make_unique<int[]>(10); // 10 integers
关于c++ - VS2015 : [C6386] Buffer Overrun while writing (even for same index value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37205179/
我有一个 Borland C++Builder 6.0 项目。在这个项目中,我使用 SQLite 库。我使用 sqlite3.c 文件(SQLite 合并 3.7.11)。一切正常。但是当我在 C++
我有以下功能: function updateChatRoom() { $.post('php/api.php', {"function":"getActiveChat"}, function(jsD
在我的代码中,我使用了一个包含 10 个对象的数组 xyz。当我尝试使用像这样的无符号整数索引访问数组的元素时:xyz[level],我得到 'Buffer overrun ' 警告。从逻辑上讲,我很
我有一段简单的代码可以创建一个 AudioRecord 对象,然后使用它来录制文件。这是非常标准的,似乎工作得很好。我使用的是运行 Android 2.2 的三星 GalaxyS Vibrant。 但
在 Java 平台上运行的应用程序与 c 上运行的另一个应用程序之间执行串行通信时,出现“ttyS0: 1 input overrun(s)”(此错误在 Java 应用程序日志中看到)。 任何人都可以
我正在对表进行非常简单的更新,这也触发了一个非常简单的触发器,它给了我错误 #1436 - Thread stack overrun: 6136 bytes used of a 131072 byt
ERRNO: 256 TEXT: SQLSTATE[HY000]: General error: 1436 Thread stack overrun: 4904 bytes used o
我有以下一段 C 代码: #include typedef union{ uint8_t c[4]; uint16_t s[2]; uint32_t l; }U4; uint
我需要设置overrun style所选项目的。要设置溢出样式,据我了解,我需要访问 buttonCell (其类型为 ObjectProperty[javafx.scene.control.List
给定错误:#1436 - 线程堆栈溢出:131072 字节堆栈使用了 6024 字节,需要 128000 字节。使用“mysqld -O thread_stack=#”指定更大的堆栈。 DROP TR
我正在使用 pexpect 连接到 linux 机器控制台,这是一台功能有限的机器。当我生成连接并尝试使用 send 或 sendline 执行命令时,我收到错误提示 "ttyAMA0: 1 inpu
在 C++ 项目中,我使用 JNI 调用 API 来启动 JVM。我已经围绕 JVM 做了一些包装,因此我可以以面向对象的方式使用所有需要的部分。到目前为止效果很好。 现在,如果 JVM 没有启动(J
当我在 Visual Studio 2015 中遇到 [Analyze -> Run Code Analysis] 引发的一些有趣问题时,我正尝试在 C 中实现合并排序。 代码如下: void Mer
我的代码中有烦人的 C6029 警告 ( description of the error on the Microsoft website )。 例如: #include // fopen, fs
我使用 AudioRecord 在 Android 应用程序中录制语音。 当我在 Samsung Galaxy S 上测试时,我有这个日志。 02-21 15:56:11.676: V/AudioRe
constexpr auto CHUNKS_X = 5, CHUNKS_Y = 5, CHUNKS_Z = 1; std::array, CHUNKS_Y> ys; std::array zs; if
在下面的代码中: // If GetPrinter didn't fill in the DEVMODE, try to get it by calling // DocumentProperties
因为我在内存读取等方面有点乱。我制作了包含 1000000 个元素的 byte[] 数组,这样它们每个可以存储 1MB 的数据。我最终使用了这 1000000 个元素数组中的大约 750 个,我在检索
我是一名优秀的程序员,十分优秀!