Out-of-bounds access (ARRAY_VS_SINGLETON)

Need little help..

1
2
3
4
5
6
7
8
9
10

#include <iostream>
int main() {
  int bit = 1;
  int init = 0xf ^ (1 << bit);
  char* c = new char(2);
  sprintf(c, "%x", init);
  std::string initVal = std::string("4'h") + c;
  std::cout << initVal << std::endl;
}


Above code is compiling as I expect it to be.
Problem is when I run coverity on it, it prompts me the following message:

Out-of-bounds access (ARRAY_VS_SINGLETON). Passing "c" to function "operator +(HSTString const &, char const *)" which uses it as an array. This might corrupt or misinterpret adjacent memory locations


I am out of ideas for now. Can champs here figure out what I am doing wrong?
Last edited on
1
2
char* c = new char(2);
sprintf(c, "%x", init);


Did you mean to put new char[2]; instead? The former creates a *single* character with the value of 2 (some unprintable thing), not an array of 2. You might need more space for your sprintf anyway to include the terminating null and such, I don't remember if %x adds 0x or anything when you print like that.
Somebody told me this and I am agree with this alternative..

You cannot store the result of sprintf call into the location pointed to by c in the first place because you only allocated a single char, initialising it with a value of 2. Perhaps you wanted to use new char[2] instead, but that would still be rather unnecessary. Instead, you might as well just use the standard C++-specific facilities, e.g.,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>

int main()
{
    unsigned int bit = 1;
    unsigned int init = 0xf ^ (1u << bit);
    std::stringstream ss;
    ss << "4'h" << std::hex << init;
    std::string initVal = ss.str();
    std::cout << initVal << std::endl;
}
Topic archived. No new replies allowed.