microsoft / DirectXTex

DirectXTex texture processing library
https://walbourn.github.io/directxtex/
MIT License
1.79k stars 441 forks source link

gcc Warnings in Linux -Wstringop-overflow #432

Closed JPeterMugaas closed 6 months ago

JPeterMugaas commented 8 months ago

I was trying to compile DirectXTex with "gcc (GCC) 13.2.1 20230801" in linux and I got these warnings:

[18/19] Building CXX object CMakeFiles/DirectXTex.dir/DirectXTex/BC6HBC7.cpp.o
In member function ‘float {anonymous}::D3DX_BC7::Refine(const EncodeParams*, size_t, size_t, size_t)’,
    inlined from ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2859:46:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3413:35: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 3413 |         aOrgEndPts[p].A = Quantize(aEndPts[p].A, ms_aInfo[pEP->uMode].RGBAPrecWithP);
      |                           ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In member function ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3400:19: note: at offset 24 into destination object ‘aOrgEndPts’ of size 24
 3400 |     LDREndPntPair aOrgEndPts[BC7_MAX_REGIONS];
      |                   ^~~~~~~~~~
In member function ‘float {anonymous}::D3DX_BC7::Refine(const EncodeParams*, size_t, size_t, size_t)’,
    inlined from ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2859:46:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3413:35: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 3413 |         aOrgEndPts[p].A = Quantize(aEndPts[p].A, ms_aInfo[pEP->uMode].RGBAPrecWithP);
      |                           ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In member function ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3400:19: note: at offset 25 into destination object ‘aOrgEndPts’ of size 24
 3400 |     LDREndPntPair aOrgEndPts[BC7_MAX_REGIONS];
      |                   ^~~~~~~~~~
In member function ‘float {anonymous}::D3DX_BC7::Refine(const EncodeParams*, size_t, size_t, size_t)’,
    inlined from ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2859:46:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3413:35: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 3413 |         aOrgEndPts[p].A = Quantize(aEndPts[p].A, ms_aInfo[pEP->uMode].RGBAPrecWithP);
      |                           ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In member function ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3400:19: note: at offset 26 into destination object ‘aOrgEndPts’ of size 24
 3400 |     LDREndPntPair aOrgEndPts[BC7_MAX_REGIONS];
      |                   ^~~~~~~~~~
In member function ‘float {anonymous}::D3DX_BC7::Refine(const EncodeParams*, size_t, size_t, size_t)’,
    inlined from ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2859:46:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3413:35: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 3413 |         aOrgEndPts[p].A = Quantize(aEndPts[p].A, ms_aInfo[pEP->uMode].RGBAPrecWithP);
      |                           ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In member function ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3400:19: note: at offset 27 into destination object ‘aOrgEndPts’ of size 24
 3400 |     LDREndPntPair aOrgEndPts[BC7_MAX_REGIONS];
      |                   ^~~~~~~~~~
In member function ‘float {anonymous}::D3DX_BC7::Refine(const EncodeParams*, size_t, size_t, size_t)’,
    inlined from ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2859:46:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3414:35: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 3414 |         aOrgEndPts[p].B = Quantize(aEndPts[p].B, ms_aInfo[pEP->uMode].RGBAPrecWithP);
      |                           ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In member function ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3400:19: note: at offset 28 into destination object ‘aOrgEndPts’ of size 24
 3400 |     LDREndPntPair aOrgEndPts[BC7_MAX_REGIONS];
      |                   ^~~~~~~~~~
In member function ‘float {anonymous}::D3DX_BC7::Refine(const EncodeParams*, size_t, size_t, size_t)’,
    inlined from ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2859:46:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3414:35: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 3414 |         aOrgEndPts[p].B = Quantize(aEndPts[p].B, ms_aInfo[pEP->uMode].RGBAPrecWithP);
      |                           ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In member function ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3400:19: note: at offset 29 into destination object ‘aOrgEndPts’ of size 24
 3400 |     LDREndPntPair aOrgEndPts[BC7_MAX_REGIONS];
      |                   ^~~~~~~~~~
In member function ‘float {anonymous}::D3DX_BC7::Refine(const EncodeParams*, size_t, size_t, size_t)’,
    inlined from ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2859:46:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3414:35: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 3414 |         aOrgEndPts[p].B = Quantize(aEndPts[p].B, ms_aInfo[pEP->uMode].RGBAPrecWithP);
      |                           ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In member function ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3400:19: note: at offset 30 into destination object ‘aOrgEndPts’ of size 24
 3400 |     LDREndPntPair aOrgEndPts[BC7_MAX_REGIONS];
      |                   ^~~~~~~~~~
In member function ‘float {anonymous}::D3DX_BC7::Refine(const EncodeParams*, size_t, size_t, size_t)’,
    inlined from ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2859:46:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3414:35: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 3414 |         aOrgEndPts[p].B = Quantize(aEndPts[p].B, ms_aInfo[pEP->uMode].RGBAPrecWithP);
      |                           ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In member function ‘void {anonymous}::D3DX_BC7::Encode(uint32_t, const DirectX::HDRColorA*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3400:19: note: at offset 31 into destination object ‘aOrgEndPts’ of size 24
 3400 |     LDREndPntPair aOrgEndPts[BC7_MAX_REGIONS];
      |                   ^~~~~~~~~~
In member function ‘void {anonymous}::D3DX_BC7::Decode(DirectX::HDRColorA*) const’,
    inlined from ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3632:51:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2695:30: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 2695 |             c[i] = Unquantize(c[i], RGBAPrecWithP);
      |                    ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In function ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2595:19: note: at offset 24 into destination object ‘c’ of size 24
 2595 |         LDRColorA c[BC7_MAX_REGIONS << 1];
      |                   ^
In member function ‘void {anonymous}::D3DX_BC7::Decode(DirectX::HDRColorA*) const’,
    inlined from ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3632:51:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2695:30: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 2695 |             c[i] = Unquantize(c[i], RGBAPrecWithP);
      |                    ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In function ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2595:19: note: at offset 25 into destination object ‘c’ of size 24
 2595 |         LDRColorA c[BC7_MAX_REGIONS << 1];
      |                   ^
In member function ‘void {anonymous}::D3DX_BC7::Decode(DirectX::HDRColorA*) const’,
    inlined from ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3632:51:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2695:30: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 2695 |             c[i] = Unquantize(c[i], RGBAPrecWithP);
      |                    ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In function ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2595:19: note: at offset 26 into destination object ‘c’ of size 24
 2595 |         LDRColorA c[BC7_MAX_REGIONS << 1];
      |                   ^
In member function ‘void {anonymous}::D3DX_BC7::Decode(DirectX::HDRColorA*) const’,
    inlined from ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3632:51:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2695:30: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 2695 |             c[i] = Unquantize(c[i], RGBAPrecWithP);
      |                    ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In function ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2595:19: note: at offset 27 into destination object ‘c’ of size 24
 2595 |         LDRColorA c[BC7_MAX_REGIONS << 1];
      |                   ^
In member function ‘void {anonymous}::D3DX_BC7::Decode(DirectX::HDRColorA*) const’,
    inlined from ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3632:51:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2695:30: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 2695 |             c[i] = Unquantize(c[i], RGBAPrecWithP);
      |                    ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In function ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2595:19: note: at offset 24 into destination object ‘c’ of size 24
 2595 |         LDRColorA c[BC7_MAX_REGIONS << 1];
      |                   ^
In member function ‘void {anonymous}::D3DX_BC7::Decode(DirectX::HDRColorA*) const’,
    inlined from ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3632:51:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2695:30: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 2695 |             c[i] = Unquantize(c[i], RGBAPrecWithP);
      |                    ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In function ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2595:19: note: at offset 25 into destination object ‘c’ of size 24
 2595 |         LDRColorA c[BC7_MAX_REGIONS << 1];
      |                   ^
In member function ‘void {anonymous}::D3DX_BC7::Decode(DirectX::HDRColorA*) const’,
    inlined from ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3632:51:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2695:30: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 2695 |             c[i] = Unquantize(c[i], RGBAPrecWithP);
      |                    ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In function ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2595:19: note: at offset 26 into destination object ‘c’ of size 24
 2595 |         LDRColorA c[BC7_MAX_REGIONS << 1];
      |                   ^
In member function ‘void {anonymous}::D3DX_BC7::Decode(DirectX::HDRColorA*) const’,
    inlined from ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’ at /home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:3632:51:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2695:30: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
 2695 |             c[i] = Unquantize(c[i], RGBAPrecWithP);
      |                    ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp: In function ‘void DirectX::D3DXDecodeBC7(XMVECTOR*, const uint8_t*)’:
/home/jpmugaas/arch/directxtex/src/DirectXTex-dec2023/DirectXTex/BC6HBC7.cpp:2595:19: note: at offset 27 into destination object ‘c’ of size 24
 2595 |         LDRColorA c[BC7_MAX_REGIONS << 1];
      |                   ^
[19/19] Linking CXX static library bin/CMake/libDirectXTex.a

I see similar warnings with GCC 13.2.0 for mingw-w64.

walbourn commented 8 months ago

I do not get any of these warnings with MinGW 13.2. I did see an overflow warning related to depth values in mipmaps, but not these at all.

https://github.com/microsoft/DirectXTex/pull/434

walbourn commented 8 months ago

Also, the warnings you post above make no sense to me. The compiler knows the value is not 0.

The upper-bound is fixed and I have asserts/assumes in place, but GNUC doesn't know about them.

JPeterMugaas commented 8 months ago

I'm not completely sure myself but if there is bounds checking, then it may be safe to suppress the warning. I made a PR request to the mingw13_2 branch that does just that at https://github.com/microsoft/DirectXTex/pull/435 .

walbourn commented 6 months ago

Merged the PR.