Tag: valgrind

跟踪未初始化的静态变量

我需要调试一个丑陋而庞大的数学C库,可能是由f2c生成的。 代码滥用本地静态变量,不幸的是它在某处似乎利用了这些自动初始化为0的事实。如果使用相同的输入两次调用其入口函数,则它会给出不同的结果。 如果我卸载库并重新加载它,它可以正常工作。 它需要很快,所以我想摆脱加载/卸载。 我的问题是如何使用valgrind或任何其他工具发现这些错误,而无需手动遍历整个代码。 我正在寻找声明本地静态变量的地方,先读取,然后再写。 由于静态变量有时会通过指针进一步传递(是的 – 它太丑了),这个问题更加复杂了。 我理解人们可以争辩说,自动工具不应该检测到这样的错误,因为在某些情况下,这正是预期的行为。 还有,有没有办法让自动初始化的本地静态变量“脏”?

Valgrind警告:我应该认真对待它

背景:我有一个模仿fgets(character, 2, fp)的小例程,除了它从字符串而不是流中获取字符。 newBuff是动态分配的字符串,作为参数传递,字符声明为char character[2] 。 常规: character[0] = newBuff[0]; character[1] = ‘\0’; strcpy(newBuff, newBuff+1); strcpy在从中读取每个字符时复制信息丢失。 问题:Valgrind确实警告我这个活动,“源和目的地重叠在strcpy(0x419b818,0x419b819)”。 我应该担心这个警告吗?

__libc_freeres()中的free()/ delete / delete / realloc()无效

我正在使用-g标志和-O0编译代码。 请参阅下面的valgrind输出。 我只想知道我是否可以看到什么是无效的? 我只看到这个: ==2566== Invalid free() / delete / delete[] / realloc() ==2566== at 0x4A21244: free (vg_replace_malloc.c:468) ==2566== by 0x500FB7A: free_mem (in /lib64/libc-2.4.so) ==2566== by 0x500F781: __libc_freeres (in /lib64/libc-2.4.so) ==2566== by 0x491C719: _vgnU_freeres (vg_preloaded.c:62) ==2566== by 0x4F4E6F4: exit (in /lib64/libc-2.4.so) ==2566== by 0x4F3930A: (below main) (in /lib64/libc-2.4.so) ==2566== Address 0x403ef10 is not stack’d, malloc’d […]

创建链接列表数组时出现Valgrind错误(对于哈希表链接)

作为概述,我正在尝试在C中创建一个类似战舰的游戏,船只被放置在一个场地上。 这是我得到的错误: ==11147== Invalid write of size 8 ==11147== at 0x400786: MakeField (battleship.c:34) ==11147== Address 0x8 is not stack’d, malloc’d or (recently) free’d 这是相关的代码: struct piece{ int x; int y; int direction; int length; char name; }; struct node{ struct piece boat; struct node *next; }; struct field{ int numBoats; struct node *array[numRows]; }; struct […]

如何纠正我的C程序中的分段错误

我正在调试为knapSack编写的以下程序 #include #include #include “timer.h” #define MAX(x,y) ((x)>(y) ? (x) : (y)) #define table(i,j) table[(i)*(C+1)+(j)] int main(int argc, char **argv) { FILE *fp; long N, C, opt; // # of objects, capacity int *weights, *profits, *table, *solution; // weights and profits int verbose; // Temp variables long i, j, count, size, size1, ii, jj; // […]

为什么读取结构指针字段无效?

在Valgrind中运行该程序,它表示在结构的转换指针处存在“无效读取大小为8”。 它与calloc有关吗? 如果按原样读取它是(零)。 有一个结构(称为trie),它使用如下: #include #include #include #include const int MAX_SIZE = 20; struct _trie { int maxNode; int nextNode; int** transition; char* fin; }; typedef struct _trie * Trie; Trie createTrie (int maxNode){ Trie trie; trie = (Trie) malloc(sizeof(Trie)); printf(“size of trie: %lu, size of the struct: %lu, size of _trie: %lu\n”,sizeof(trie),sizeof(Trie), sizeof(struct _trie)); […]

未初始化的值是由堆栈分配创建的 – valgrind

我用valgrind用选项track-origins=yes来调试我的代码并遇到了这个错误。 $ valgrind –track-origins=yes ./frgtnlng out ==7098== ==7098== Conditional jump or move depends on uninitialised value(s) ==7098== at 0x4C2F1BC: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==7098== by 0x400857: main (frgtnlng.c:24) ==7098== Uninitialised value was created by a stack allocation ==7098== at 0x40064C: main (frgtnlng.c:9) ==7098== ==7098== Conditional jump or move depends on uninitialised value(s) ==7098== at 0x40085A: main […]

Valgrind非法指令AVX

使用valgrind评估我的程序时收到一些错误。 更准确地说,我得到的错误就像 vex amd64-> IR:未处理的指令字节:0xC5 0xF8 0x28 0x0 0xC5 0xF8 0x29 0x45 ……非法指令 我把问题分离成一个非常简单的例子 #include int main() { float f __attribute__((aligned(16))); // No need to be aligned f = 2.0f; __m128 a = _mm_broadcast_ss(&f); return 0; } 该程序使用gcc编译,选项为-mavx。 如果使用SSE2指令_mm_set1_ps,则会发生相同的错误,但仅在使用-mavx编译时才会发生。 使用-msse2编译程序时,valgrind报告没有错误。 我怀疑这是一个valgrind错误,但是找不到关于x86的任何报告。 我的机器是Core-i7 Sandy-Bridge和valgrind版本3.7.0。 如果有人有更好的替代valgrind的寄存器感知编程,我想知道。 提前致谢

从结构中的指针获取数据“读/写无效”

我试图在数组中执行循环缓冲区。 我将数据保存在结构中,并通过推送,弹出等方法管理它。程序或多或少具有function和行为符合预期,但是我在valgrind测试中遇到错误。 我无法找出我的代码有什么问题。 虽然看起来像我的结构中通过指针管理数据是关键问题。 如果有人能指出我正确的方向,我将非常感激,因为我现在真的迷失了。 这是我的结构的样子: typedef struct queue_t{ int* data; int* end; int* head; int* tail; int max_length; int cur_length; } queue_t; 以下是我管理缓冲区操作的方法: (注释代码产生与memcpy几乎相同的错误) int* increase(int* point, queue_t* queue){ if(point != queue->end){ point = point + sizeof(int*); return point; }else{ return queue->data; } } queue_t* create_queue(int capacity){ queue_t* fifo; fifo = malloc(sizeof(queue_t)); fifo->data = […]

OS X上的GCC分配的内存超出预期

我正在使用Mac OS X 10.11.4和Xcode 7.3以及gcc编译器。 我用homebrew下载了valgrind 3.11。 当我用valgrind运行我的C程序时,这是输出 ==4297== ==4297== HEAP SUMMARY: ==4297== in use at exit: 30,208 bytes in 188 blocks ==4297== total heap usage: 265 allocs, 77 frees, 40,286 bytes allocated ==4297== ==4297== LEAK SUMMARY: ==4297== definitely lost: 0 bytes in 0 blocks ==4297== indirectly lost: 0 bytes in 0 blocks ==4297== possibly […]