Skip to content

Commit

Permalink
Enable strict aliasing
Browse files Browse the repository at this point in the history
  • Loading branch information
thbeu committed Feb 5, 2024
1 parent a87f673 commit befceca
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 54 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ endif()
if(MSVC)
target_compile_options(${PACKAGE} PRIVATE /W4)
else()
target_compile_options(${PACKAGE} PRIVATE -Wall -Wextra -Wformat-signedness -pedantic -fno-strict-aliasing -Wno-unknown-warning-option)
target_compile_options(${PACKAGE} PRIVATE -Wall -Wextra -Wformat-signedness -pedantic -Wno-unknown-warning-option)
endif()

if(WIN32 AND NOT CYGWIN)
Expand Down
8 changes: 4 additions & 4 deletions sbnsearch.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,10 +148,10 @@ SBNSearchHandle SBNOpenDiskTree(const char *pszSBNFilename,
memcpy(&hSBN->dfMaxY, abyHeader + 56, 8);

#if !defined(SHP_BIG_ENDIAN)
SHP_SWAP64(&hSBN->dfMinX);
SHP_SWAP64(&hSBN->dfMinY);
SHP_SWAP64(&hSBN->dfMaxX);
SHP_SWAP64(&hSBN->dfMaxY);
SHP_SWAPDOUBLE(&hSBN->dfMinX);
SHP_SWAPDOUBLE(&hSBN->dfMinY);
SHP_SWAPDOUBLE(&hSBN->dfMaxX);
SHP_SWAPDOUBLE(&hSBN->dfMaxY);
#endif

if (hSBN->dfMinX > hSBN->dfMaxX || hSBN->dfMinY > hSBN->dfMaxY)
Expand Down
10 changes: 9 additions & 1 deletion shapefil_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,5 +66,13 @@
*STATIC_CAST(uint32_t *, p) = _SHP_SWAP32(*STATIC_CAST(uint32_t *, p))
#define SHP_SWAP64(p) \
*STATIC_CAST(uint64_t *, p) = _SHP_SWAP64(*STATIC_CAST(uint64_t *, p))

#define SHP_SWAPDOUBLE(x) \
do \
{ \
uint64_t _n64; \
void *_lx = x; \
memcpy(&_n64, _lx, 8); \
_n64 = SHP_SWAP64(_n64); \
memcpy(_lx, &_n64, 8); \
} while (0)
#endif /* ndef SHAPEFILE_PRIVATE_H_INCLUDED */
88 changes: 44 additions & 44 deletions shpopen.c
Original file line number Diff line number Diff line change
Expand Up @@ -2145,16 +2145,16 @@ SHPObject SHPAPI_CALL1(*) SHPReadObject(SHPHandle psSHP, int hEntity)
/* -------------------------------------------------------------------- */
/* Get the X/Y bounds. */
/* -------------------------------------------------------------------- */
memcpy(&(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8);
memcpy(&(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8);
memcpy(&(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8);
memcpy(&(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8);
memcpy(&psShape->dfXMin, psSHP->pabyRec + 8 + 4, 8);
memcpy(&psShape->dfYMin, psSHP->pabyRec + 8 + 12, 8);
memcpy(&psShape->dfXMax, psSHP->pabyRec + 8 + 20, 8);
memcpy(&psShape->dfYMax, psSHP->pabyRec + 8 + 28, 8);

#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(&(psShape->dfXMin));
SHP_SWAP64(&(psShape->dfYMin));
SHP_SWAP64(&(psShape->dfXMax));
SHP_SWAP64(&(psShape->dfYMax));
SHP_SWAPDOUBLE(&psShape->dfXMin);
SHP_SWAPDOUBLE(&psShape->dfYMin);
SHP_SWAPDOUBLE(&psShape->dfXMax);
SHP_SWAPDOUBLE(&psShape->dfYMax);
#endif

/* -------------------------------------------------------------------- */
Expand Down Expand Up @@ -2333,8 +2333,8 @@ SHPObject SHPAPI_CALL1(*) SHPReadObject(SHPHandle psSHP, int hEntity)
8);

#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(psShape->padfX + i);
SHP_SWAP64(psShape->padfY + i);
SHP_SWAPDOUBLE(psShape->padfX + i);
SHP_SWAPDOUBLE(psShape->padfY + i);
#endif
}

Expand All @@ -2347,20 +2347,20 @@ SHPObject SHPAPI_CALL1(*) SHPReadObject(SHPHandle psSHP, int hEntity)
psShape->nSHPType == SHPT_ARCZ ||
psShape->nSHPType == SHPT_MULTIPATCH)
{
memcpy(&(psShape->dfZMin), psSHP->pabyRec + nOffset, 8);
memcpy(&(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8);
memcpy(&psShape->dfZMin, psSHP->pabyRec + nOffset, 8);
memcpy(&psShape->dfZMax, psSHP->pabyRec + nOffset + 8, 8);

#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(&(psShape->dfZMin));
SHP_SWAP64(&(psShape->dfZMax));
SHP_SWAPDOUBLE(&psShape->dfZMin);
SHP_SWAPDOUBLE(&psShape->dfZMax);
#endif

for (int i = 0; STATIC_CAST(uint32_t, i) < nPoints; i++)
{
memcpy(psShape->padfZ + i,
psSHP->pabyRec + nOffset + 16 + i * 8, 8);
#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(psShape->padfZ + i);
SHP_SWAPDOUBLE(psShape->padfZ + i);
#endif
}

Expand All @@ -2379,20 +2379,20 @@ SHPObject SHPAPI_CALL1(*) SHPReadObject(SHPHandle psSHP, int hEntity)
/* -------------------------------------------------------------------- */
if (nEntitySize >= STATIC_CAST(int, nOffset + 16 + 8 * nPoints))
{
memcpy(&(psShape->dfMMin), psSHP->pabyRec + nOffset, 8);
memcpy(&(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8);
memcpy(&psShape->dfMMin, psSHP->pabyRec + nOffset, 8);
memcpy(&psShape->dfMMax, psSHP->pabyRec + nOffset + 8, 8);

#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(&(psShape->dfMMin));
SHP_SWAP64(&(psShape->dfMMax));
SHP_SWAPDOUBLE(&psShape->dfMMin);
SHP_SWAPDOUBLE(&psShape->dfMMax);
#endif

for (int i = 0; STATIC_CAST(uint32_t, i) < nPoints; i++)
{
memcpy(psShape->padfM + i,
psSHP->pabyRec + nOffset + 16 + i * 8, 8);
#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(psShape->padfM + i);
SHP_SWAPDOUBLE(psShape->padfM + i);
#endif
}
psShape->bMeasureIsUsed = TRUE;
Expand Down Expand Up @@ -2503,8 +2503,8 @@ SHPObject SHPAPI_CALL1(*) SHPReadObject(SHPHandle psSHP, int hEntity)
memcpy(psShape->padfY + i, psSHP->pabyRec + 48 + 16 * i + 8, 8);

#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(psShape->padfX + i);
SHP_SWAP64(psShape->padfY + i);
SHP_SWAPDOUBLE(psShape->padfX + i);
SHP_SWAPDOUBLE(psShape->padfY + i);
#endif
}

Expand All @@ -2513,37 +2513,37 @@ SHPObject SHPAPI_CALL1(*) SHPReadObject(SHPHandle psSHP, int hEntity)
/* -------------------------------------------------------------------- */
/* Get the X/Y bounds. */
/* -------------------------------------------------------------------- */
memcpy(&(psShape->dfXMin), psSHP->pabyRec + 8 + 4, 8);
memcpy(&(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8);
memcpy(&(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8);
memcpy(&(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8);
memcpy(&psShape->dfXMin, psSHP->pabyRec + 8 + 4, 8);
memcpy(&psShape->dfYMin, psSHP->pabyRec + 8 + 12, 8);
memcpy(&psShape->dfXMax, psSHP->pabyRec + 8 + 20, 8);
memcpy(&psShape->dfYMax, psSHP->pabyRec + 8 + 28, 8);

#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(&(psShape->dfXMin));
SHP_SWAP64(&(psShape->dfYMin));
SHP_SWAP64(&(psShape->dfXMax));
SHP_SWAP64(&(psShape->dfYMax));
SHP_SWAPDOUBLE(&psShape->dfXMin);
SHP_SWAPDOUBLE(&psShape->dfYMin);
SHP_SWAPDOUBLE(&psShape->dfXMax);
SHP_SWAPDOUBLE(&psShape->dfYMax);
#endif

/* -------------------------------------------------------------------- */
/* If we have a Z coordinate, collect that now. */
/* -------------------------------------------------------------------- */
if (psShape->nSHPType == SHPT_MULTIPOINTZ)
{
memcpy(&(psShape->dfZMin), psSHP->pabyRec + nOffset, 8);
memcpy(&(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8);
memcpy(&psShape->dfZMin, psSHP->pabyRec + nOffset, 8);
memcpy(&psShape->dfZMax, psSHP->pabyRec + nOffset + 8, 8);

#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(&(psShape->dfZMin));
SHP_SWAP64(&(psShape->dfZMax));
SHP_SWAPDOUBLE(&psShape->dfZMin);
SHP_SWAPDOUBLE(&psShape->dfZMax);
#endif

for (int i = 0; STATIC_CAST(uint32_t, i) < nPoints; i++)
{
memcpy(psShape->padfZ + i,
psSHP->pabyRec + nOffset + 16 + i * 8, 8);
#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(psShape->padfZ + i);
SHP_SWAPDOUBLE(psShape->padfZ + i);
#endif
}

Expand All @@ -2560,20 +2560,20 @@ SHPObject SHPAPI_CALL1(*) SHPReadObject(SHPHandle psSHP, int hEntity)
/* -------------------------------------------------------------------- */
if (nEntitySize >= STATIC_CAST(int, nOffset + 16 + 8 * nPoints))
{
memcpy(&(psShape->dfMMin), psSHP->pabyRec + nOffset, 8);
memcpy(&(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8);
memcpy(&psShape->dfMMin, psSHP->pabyRec + nOffset, 8);
memcpy(&psShape->dfMMax, psSHP->pabyRec + nOffset + 8, 8);

#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(&(psShape->dfMMin));
SHP_SWAP64(&(psShape->dfMMax));
SHP_SWAPDOUBLE(&psShape->dfMMin);
SHP_SWAPDOUBLE(&psShape->dfMMax);
#endif

for (int i = 0; STATIC_CAST(uint32_t, i) < nPoints; i++)
{
memcpy(psShape->padfM + i,
psSHP->pabyRec + nOffset + 16 + i * 8, 8);
#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(psShape->padfM + i);
SHP_SWAPDOUBLE(psShape->padfM + i);
#endif
}
psShape->bMeasureIsUsed = TRUE;
Expand Down Expand Up @@ -2622,8 +2622,8 @@ SHPObject SHPAPI_CALL1(*) SHPReadObject(SHPHandle psSHP, int hEntity)
memcpy(psShape->padfY, psSHP->pabyRec + 20, 8);

#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(psShape->padfX);
SHP_SWAP64(psShape->padfY);
SHP_SWAPDOUBLE(psShape->padfX);
SHP_SWAPDOUBLE(psShape->padfY);
#endif

int nOffset = 20 + 8;
Expand All @@ -2636,7 +2636,7 @@ SHPObject SHPAPI_CALL1(*) SHPReadObject(SHPHandle psSHP, int hEntity)
memcpy(psShape->padfZ, psSHP->pabyRec + nOffset, 8);

#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(psShape->padfZ);
SHP_SWAPDOUBLE(psShape->padfZ);
#endif

nOffset += 8;
Expand All @@ -2653,7 +2653,7 @@ SHPObject SHPAPI_CALL1(*) SHPReadObject(SHPHandle psSHP, int hEntity)
memcpy(psShape->padfM, psSHP->pabyRec + nOffset, 8);

#if defined(SHP_BIG_ENDIAN)
SHP_SWAP64(psShape->padfM);
SHP_SWAPDOUBLE(psShape->padfM);
#endif
psShape->bMeasureIsUsed = TRUE;
}
Expand Down
8 changes: 4 additions & 4 deletions shptree.c
Original file line number Diff line number Diff line change
Expand Up @@ -742,10 +742,10 @@ static bool SHPSearchDiskTreeNode(SHPTreeDiskHandle hDiskTree,
hDiskTree->fpQIX));
if (bNeedSwap)
{
SHP_SWAP64(adfNodeBoundsMin + 0);
SHP_SWAP64(adfNodeBoundsMin + 1);
SHP_SWAP64(adfNodeBoundsMax + 0);
SHP_SWAP64(adfNodeBoundsMax + 1);
SHP_SWAPDOUBLE(adfNodeBoundsMin + 0);
SHP_SWAPDOUBLE(adfNodeBoundsMin + 1);
SHP_SWAPDOUBLE(adfNodeBoundsMax + 0);
SHP_SWAPDOUBLE(adfNodeBoundsMax + 1);
}

nFReadAcc += STATIC_CAST(
Expand Down

0 comments on commit befceca

Please sign in to comment.