MengRao/fmtlog

打印字符串可能出现内存越界风险

colderleo opened this issue · 0 comments

如果以下面的形式打印字符串:

logi("teststr={:.12s}", teststr);

程序运行时会首先拷贝teststr指向的完整字符串,而不是只拷贝12个字符。当teststr并不是以\0结尾的字符串时,就可能导致内存访问越界。

测试程序如下:

  constexpr int pagesize = 4096;

  // mmap得到一个内存上孤立的页,使得访问teststr[4096]会出现内存越界
  char *teststr = (char *)mmap((void*)0x60000000ULL, pagesize, PROT_READ | PROT_WRITE , MAP_SHARED | MAP_ANONYMOUS , -1, 0);
  if(teststr == MAP_FAILED) 
  {
    perror("map failed");
    return -1;
  }
  for(int i=0; i<pagesize; ++i) {
    char *tmp = teststr+i;
    *tmp = 's';
  }
  
  //teststr[4095] = 0; 加上这句则不会出错

  
  // fmt::print("teststr={:.12s}\n", teststr);
  logi("teststr={:.12s}", teststr);

实测fmt::print 和 logi都会出现segment fault,所以在使用的时候有什么方法可以避免该问题?