【问题标题】:core dump when calling vsnprintf调用 vsnprintf 时的核心转储
【发布时间】:2012-09-30 21:53:21
【问题描述】:

我在 ubuntu 12.04 上,使用 uname -a: Linux lu057801 3.2.0-31-generic #50-Ubuntu SMP Fri Sep 7 16:16:45 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

g++ --版本: Linux lu057801 3.2.0-31-generic #50-Ubuntu SMP Fri Sep 7 16:16:45 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

我在调用 vsnprintf 时得到一个核心转储。以下是产生问题的完整代码:

// compile: g++ -g -o test vsnprintf_test.c

#include <stdarg.h>
#include <stdio.h>
#include <string>

void vout(char *string, char *fmt, ...);
char fmt1 [] = "%s  %s  %s\n";

size_t snprintf_1(char* buffer, const size_t bufSize, const char* format, ...);
size_t vsnprintf_1(char* buffer, const size_t bufSize, const char* format, va_list args);

int main(void)
{
  char * format = "%s";
  char buffer[] = "/var/tmp\0"; //char * buffer = "/var/tmp\0";
  int bufSize=sizeof(buffer); //int bufSize=11;
  snprintf_1(buffer, bufSize, format);
}


size_t snprintf_1(char* buffer, const size_t bufSize, const char* format, ...)
{
    va_list args;
    va_start(args, format);
    size_t rc = vsnprintf_1(buffer, bufSize, format, args);
    va_end(args);
    return rc;
}


size_t vsnprintf_1(char* buffer, const size_t bufSize, const char* format, va_list args)
{
    int rc = 0;
    rc = vsnprintf(buffer, bufSize, format, args);
}

编译为:g++ -g -o test vsnprintf_test.c 并运行会给我以下回溯:

(gdb) run
Starting program: /home/mafunk/software/MattsSnippets/test 

Program received signal SIGSEGV, Segmentation fault.
_IO_vsnprintf (string=0x400738 "/var/tmp", maxlen=<optimized out>, format=0x400730 "%s", args=0x7fffffffe0b0) at vsnprintf.c:118
118     vsnprintf.c: No such file or directory.
(gdb) bt
#0  _IO_vsnprintf (string=0x40072f "/var/tmp", maxlen=<optimized out>, format=0x40072c "%s", args=0x7fffffffe0b0) at vsnprintf.c:118
#1  0x0000000000400639 in vsnprintf_1 (buffer=0x40072f "/var/tmp", bufSize=11, format=0x40072c "%s", args=0x7fffffffe0b0)
at vsnprintf_test.c:36
#2  0x00000000004005f2 in snprintf_1 (buffer=0x40072f "/var/tmp", bufSize=11, format=0x40072c "%s") at vsnprintf_test.c:27
#3  0x0000000000400541 in main () at vsnprintf_test.c:19

我想我不确定为什么会这样。任何帮助将不胜感激。

【问题讨论】:

    标签: c++ printf


    【解决方案1】:

    由于您尝试写入的目标是字符串文字,因此导致了段错误。

    此外,调用snprintf_1(buffer, bufSize, format); 传递了"%s" 格式字符串,但没有其他参数。格式字符串需要一个额外的char * 参数,代码将在调用堆栈上为您未提供的字符串指针读取随机内存。

    【讨论】:

    • 这是另一个错误,代码应该是snprintf_1(buffer, bufSize, format, "some string here");
    【解决方案2】:

    您正在修改字符串文字,这是未定义的行为。改成这个,它可能会起作用(尽管你的缓冲区对我来说仍然太小了)。

    char buffer[] = "/var/tmp\0";
    

    在此代码中,buffer 是一个数组,而不是指向字符串文字的指针。

    【讨论】:

    • 可能也想修复 bufsize 以匹配
    • 是的,bufSize = sizeof buffer;
    • 所以我改成了 char buffer[] = "/var/tmp\0"; int bufSize=sizeof(缓冲区);但我仍然得到一个核心转储。我将在上面进行更改,但将旧方式注释掉。
    • @user990234,Blastfurnace 可以解决这个问题。
    【解决方案3】:

    你的缓冲区太小

    char * buffer = "/"/var/tmp/.SHM_SAP_IPMM_0008_no-sid\0";  **//37 char** 
    
    int bufSize=**35**;  
    

    【讨论】:

    • 对不起,不得不改变一些东西,你对我来说太快了。让我直截了当。好的,我相信该帖子现在符合预期。无论如何,问题仍然存在。
    • 哦,好的:)。让我看看
    • 您的缓冲区仍然太小。 \0 正在计数
    • 真正的问题不是目标的大小,而是因为它是一个字符串文字,任何写入它的尝试都会出现段错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2015-05-12
    • 2013-02-22
    • 2014-10-06
    相关资源
    最近更新 更多