Re: [Valgrind-users] Valgrind not finding issue with writing/reading past array?

2022-09-26 Thread Tom Hughes via Valgrind-users

This is in fact documented in the FAQ here:

https://valgrind.org/docs/manual/faq.html#faq.overruns

The fact it's an array is not actually important - there is no
overrun detection for any global or stack variables.

The reason is that because valgrind is operating on an existing
binary there is no way to insert guards between variables because
the compiler has already fixed the layout - for the heap valgrind
can replace the allocate with one that adds guards around each
allocated block.

The tool Philippe refers to tried to use debug information where
possible to spot out of bounds writes but it wasn't very successful.

Better is to use address sanitizer, which requires recompilation
but because of that it is able to add guards around variables.

Tom

On 26/09/2022 21:20, Philippe Waroquiers wrote:

Valgrind does not check out of bound write in arrays, unless these arrays are 
malloc-ed
(and so valgrind can detect the write out of the limit of the malloc-ed block).

Valgrind used to contain an experimental tool (sgcheck) that did such stack 
array checks,
but it had several limitations and problems, and was removed.

Thanks
Philippe

On Mon, 2022-09-26 at 14:13 -0600, Grant Schoep wrote:

So I noticed something in my code that looked wrong to me, but valgrind didn't 
report
anything. I made a small example of it, and still no findings. I'm sure this 
code is
reading/writing past its array. But valgind doesn't say anything.

I'm I not understanding something or is this a bug.

Using:
  valgrind-3.19.0, gcc 4.8.5, CentOS 7

I also tried
valgrind-3.19.0, gcc 7.3.1, Amazon Linux 2

Here is the code.
--
#include 
#include 

int main()
{
    char retStr[32];

    // this is bad right? 40 bytes when above was 32?

    memset(retStr, 'F', 40);
   
    // These are "writing"  past the allocated memory?

    retStr[32] = 'A';
    retStr[33] = 'B';

    // These should be fine

    printf("***  retStr is %c\n", retStr[30]);
    printf("***  retStr is %c\n", retStr[31]);

    // These are reading past allocated memory?

    printf("***  retStr is %c\n", retStr[32]);
    printf("***  retStr is %c\n", retStr[33]);

    return 0;
}
---


Compiled:
"gcc filename.cxx"

Ran via this command
"valgrind ./a.out"



___
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users





___
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users


--
Tom Hughes (t...@compton.nu)
http://compton.nu/



___
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users


Re: [Valgrind-users] Valgrind not finding issue with writing/reading past array?

2022-09-26 Thread Philippe Waroquiers
Valgrind does not check out of bound write in arrays, unless these arrays are 
malloc-ed
(and so valgrind can detect the write out of the limit of the malloc-ed block).

Valgrind used to contain an experimental tool (sgcheck) that did such stack 
array checks,
but it had several limitations and problems, and was removed.

Thanks
Philippe

On Mon, 2022-09-26 at 14:13 -0600, Grant Schoep wrote:
> So I noticed something in my code that looked wrong to me, but valgrind 
> didn't report
> anything. I made a small example of it, and still no findings. I'm sure this 
> code is
> reading/writing past its array. But valgind doesn't say anything. 
> 
> I'm I not understanding something or is this a bug.
> 
> Using:
>  valgrind-3.19.0, gcc 4.8.5, CentOS 7
> 
> I also tried
> valgrind-3.19.0, gcc 7.3.1, Amazon Linux 2
> 
> Here is the code.
> --
> #include 
> #include 
> 
> int main()
> {
>    char retStr[32];
>    
>    // this is bad right? 40 bytes when above was 32?
>    memset(retStr, 'F', 40);
>       
>    // These are "writing"  past the allocated memory?
>    retStr[32] = 'A';
>    retStr[33] = 'B';
>    
>    // These should be fine
>    printf("***  retStr is %c\n", retStr[30]);
>    printf("***  retStr is %c\n", retStr[31]);
>    
>    // These are reading past allocated memory?
>    printf("***  retStr is %c\n", retStr[32]);
>    printf("***  retStr is %c\n", retStr[33]);
> 
>    return 0;
> }
> ---
> 
> 
> Compiled:
> "gcc filename.cxx"
> 
> Ran via this command
> "valgrind ./a.out"
> 
> 
> 
> ___
> Valgrind-users mailing list
> Valgrind-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/valgrind-users




___
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users


[Valgrind-users] Valgrind not finding issue with writing/reading past array?

2022-09-26 Thread Grant Schoep
So I noticed something in my code that looked wrong to me, but valgrind
didn't report anything. I made a small example of it, and still no
findings. I'm sure this code is reading/writing past its array. But valgind
doesn't say anything.

I'm I not understanding something or is this a bug.

Using:
valgrind-3.19.0, gcc 4.8.5, CentOS 7

I also tried
valgrind-3.19.0, gcc 7.3.1, Amazon Linux 2

Here is the code.
--
#include 
#include 

int main()
{
   char retStr[32];

   // this is bad right? 40 bytes when above was 32?
   memset(retStr, 'F', 40);

   // These are "writing"  past the allocated memory?
   retStr[32] = 'A';
   retStr[33] = 'B';

   // These should be fine
   printf("***  retStr is %c\n", retStr[30]);
   printf("***  retStr is %c\n", retStr[31]);

   // These are reading past allocated memory?
   printf("***  retStr is %c\n", retStr[32]);
   printf("***  retStr is %c\n", retStr[33]);

   return 0;
}
---


Compiled:
"gcc filename.cxx"

Ran via this command
"valgrind ./a.out"
___
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users