可能重复:
C++错误:free():下一个大小无效(快):
这是一个C++问题(虽然是'C++被滥用'的问题).备选副本:面临错误:glibc检测到免费无效下一个大小(快)
我正在使用Linux工具生成一些n/w流量,但是当我尝试发送大于某个长度的数据时,当工具为其提供时,会出现此错误.
我的整个项目都介于两者之间.由于我没有创建该工具,因此不确定错误发生在哪里......并且此错误(偶数gdb)没有给出关于问题所在位置的任何提示.如何检测错误点?
如果有问题,我会给出一些问题的快照.请指导我该怎么办?它对我来说看起来像一个网格.
udit@udit-Dabba ~ $ sendip -v -p ipv6 -f file.txt -6s ::1 -p esp -es 0x20 -eq 0x40 -ei
abcd -eI zxc -p tcp -ts 21 -td 21 ::2 | more
*** glibc detected *** sendip: free(): invalid next size (normal): 0x09da25e8 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x6b961)[0x17b961]
/lib/i386-linux-gnu/libc.so.6(+0x6d28b)[0x17d28b]
/lib/i386-linux-gnu/libc.so.6(cfree+0x6d)[0x18041d]
/lib/i386-linux-gnu/libc.so.6(fclose+0x14a)[0x16b9ca]
/lib/i386-linux-gnu/libc.so.6(+0xe053f)[0x1f053f]
/lib/i386-linux-gnu/libc.so.6(__res_ninit+0x25)[0x1f0815]
/lib/i386-linux-gnu/libc.so.6(__res_maybe_init+0x130)[0x1f1810]
/lib/i386-linux-gnu/libc.so.6(__nss_hostname_digits_dots+0x34)[0x1f37d4]
/lib/i386-linux-gnu/libc.so.6(gethostbyname2+0x96)[0x1f82f6]
/usr/local/lib/sendip/ipv6.so(set_addr+0x2d)[0x3eec69]
sendip(main+0x8eb)[0x804a635]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x126e37]
sendip[0x8048f81]
======= Memory map: ========
00110000-0026a000 r-xp 00000000 08:07 3408705 /lib/i386-linux-gnu/libc-2.13.so
0026a000-0026b000 ---p 0015a000 …Run Code Online (Sandbox Code Playgroud) 我正在阅读专家c,并通过setjump和longjump部分,所以想在我的ubuntu 11.10上运行代码,但是当我包含setjump.h时,gcc编译器抱怨它找不到头文件,我发现/ user/include /目录中没有setjump.h.所以我该怎么做?你能给我一些建议吗?
我在C中编写一个简单的堆栈程序,最后有一个灵活的void*数组.当需要更多的元素来推入数组时,我使用realloc()来创建一个新的堆栈,释放旧的堆栈并将新的分配给旧的堆栈.(我目前没有pop()函数).
#include <stdlib.h>
#include <stdio.h>
typedef struct Stack
{
int top, length;
void* start_ptr[];
} Stack;
Stack* init_stack(int n_items)
{
Stack* stack;
stack = malloc(sizeof(int) * 3 + sizeof(void*) * n_items);
stack->top = -1;
stack->length = n_items;
return stack;
}
Stack* increase_stacksize(Stack* stack, int n_itemsToAdd)
{
Stack* newstack;
newstack = realloc(stack, sizeof(*stack) + sizeof(void*) * (n_itemsToAdd + stack->length));
if(newstack != NULL)
//printf("\nDebug print - array reallocated\n");
free(stack);
stack = newstack;
stack->length += n_itemsToAdd;
return stack;
}
Stack* push(Stack* stack, void* …Run Code Online (Sandbox Code Playgroud) 看来我在libc中遇到了一个可能的错误.我有以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
struct bla
{
int a,b,c,d;
};
pthread_t tid;
void print (const char *s, const struct bla *fp);
void * thr_fn1 ( void * arg);
int main()
{
struct bla *bla_main;
pthread_create (&tid,NULL,thr_fn1,NULL);
pthread_join (tid, (void *) &bla_main);
print ("Old thread: \n",bla_main);
return 0;
}
void print (const char *s, const struct bla *bla_print)
{
printf ("%s\n",s);
printf ("Struct address: %p\n",bla_print);
printf ("fp.a = %d\n",bla_print->a);
printf ("fp.b = %d\n",bla_print->b);
printf ("fp.c = …Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
void wat(void *ptr){
*(int*)ptr = 0x4A424F4B;
return;
}
int main(int argc, char **argv){
FILE *wtf = fopen("wat", "wb");
void *ptr;
wat(ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这实际上编译并没有错误执行,你甚至可以fwrite的内容*(int*)ptr,你会得到0x4A424F4B.但是,当您删除此行时:
FILE *wtf = fopen("wat", "wb");
Run Code Online (Sandbox Code Playgroud)
*(int*)ptr = 0x4A424F4B;会突然导致分段错误.为什么?
我在C++工作.我正在研究一种方法来改变堆栈的最大容量,我对我得到的错误感到困惑.以下是我的方法.
void Stack::setCapacity(unsigned newCapacity){
if(newCapacity< this->getSize()){
throw StackException("setCapacity()",
"the size is larger than the desired capacity");
} else {
if(newCapacity != myCapacity){
Item * tempArray = new Item[newCapacity];
if(newCapacity < myCapacity){
for(unsigned i=0; i<newCapacity;i++){
tempArray[i] = myArray[i];
}
} else if (newCapacity > myCapacity) {
for(unsigned i=0; i<myCapacity; i++){
tempArray[i] = myArray[i];
}
}
for(unsigned i=0; i<newCapacity; i++){
myArray[i] = tempArray[i];
}
delete tempArray;
}
myCapacity = newCapacity;
}
}
Run Code Online (Sandbox Code Playgroud)
我还编写了一个测试方法来测试我的setCapacity()方法是否有效.
void StackTester::setCapacityTest() {
cout << "- setCapacity... " << …Run Code Online (Sandbox Code Playgroud) 我有一个基于ctypes的库,它包装了一个C库,有时会分配需要释放的内存.在Linux下这很容易,因为常见的glibc功能已链接到该C库中,我可以简单地调用free()它.但是,当我在Windows下访问第三方编译的库时,看起来无法使用相同的功能.
ctypes.util.find_msvcrt()看起来很有希望,但即使我在Windows下运行,它也会返回None.我不确定这是否意味着源DLL是使用Microsoft工具链之外的其他东西构建的.
所以,我留下的记忆是自由的,没有明显的,简单的方法来做到这一点.有没有人有任何想法?
你好我学校的每个人都必须在ASM [intel] [NASM]做我自己的strdup功能.
我有一个奇怪的问题......
在我的代码中,如果我 call _malloc
我的代码段错误与此错误:
Program received signal SIGSEGV, Segmentation fault.
0x00007fff849612da in stack_not_16_byte_aligned_error () from /usr/lib/system/libdyld.dylib
Run Code Online (Sandbox Code Playgroud)
我不明白为什么,因为在.text中我说过 extern _malloc
有人知道我为什么会犯这个错误?:)
这是我的代码:
section .text
global _ft_strdup
extern _strlen
extern _malloc
; extern _ft_memcpy
_ft_strdup:
call _strlen ;rax = len of str
mov r8, rdi ;r8 = str = src
inc rax ;rax++
; mov r9, rax ;len of dest with '\0'
mov rdi, rax ;to send the len for malloc
call _malloc ;rax = ptr of dest …Run Code Online (Sandbox Code Playgroud) 有多种语言具有其编译器/库的参考实现,但为什么C没有参考实现?
我知道GCC和glibc被广泛使用,微软有他们也使用的版本,但为什么不是一个主要的实现,例如python?(是的,我知道还有其他实现,但有一个MAIN/Reference python)是
不是与Linux和Windows等操作系统在C中实现至少部分API的事实有关吗?谢谢.
我正在看这个页面:https ://sys.readthedocs.io/en/latest/doc/01_introduction.html
,它解释了glibc如何进行系统调用.
在其中一个例子的代码进行检查,并且证明,这最后一条指令的glibc确实给真正做一个系统调用(意味着中断给CPU)是用汇编....那么,为什么在装配的glibc的一部分?通过在装配中写下那么小的部分有什么优势吗?
此外,运行时的共享库已经编译为机器代码正确吗?
那么为什么在编译之前使用两种不同的语言会有什么优势呢?谢谢.