Work around code with undefined behavior

- Fix some code with undefined behavior
- Build with -fno-strict-aliasing
- Disable various compiler tree optimizations that trigger reproducible
  crashes in gtkwave without generating compiler warnings (#1064090)
This commit is contained in:
Paul Howarth 2014-02-19 14:28:19 +00:00
parent bec5b682bd
commit a22c7e76ab
2 changed files with 160 additions and 30 deletions

View File

@ -0,0 +1,120 @@
diff -crb judy-1.0.5-orig/src/JudyCommon/JudyByCount.c judy-1.0.5/src/JudyCommon/JudyByCount.c
*** judy-1.0.5-orig/src/JudyCommon/JudyByCount.c 2005-02-15 15:06:07.000000000 -0600
--- judy-1.0.5/src/JudyCommon/JudyByCount.c 2014-02-18 13:45:35.225145230 -0600
***************
*** 817,823 ****
// Shorthand for where to find start of Index bytes array:
#ifdef JUDY1
! #define PJI (Pjp->jp_1Index)
#else
#define PJI (Pjp->jp_LIndex)
#endif
--- 817,823 ----
// Shorthand for where to find start of Index bytes array:
#ifdef JUDY1
! #define PJI (Pjp->jp_2Index)
#else
#define PJI (Pjp->jp_LIndex)
#endif
diff -crb judy-1.0.5-orig/src/JudyCommon/JudyGet.c judy-1.0.5/src/JudyCommon/JudyGet.c
*** judy-1.0.5-orig/src/JudyCommon/JudyGet.c 2005-02-15 15:06:07.000000000 -0600
--- judy-1.0.5/src/JudyCommon/JudyGet.c 2014-02-18 13:49:50.840632644 -0600
***************
*** 630,636 ****
#ifdef JUDY1
#define CHECKINDEXNATIVE(LEAF_T, PJP, IDX, INDEX) \
! if (((LEAF_T *)((PJP)->jp_1Index))[(IDX) - 1] == (LEAF_T)(INDEX)) \
return(1)
#define CHECKLEAFNONNAT(LFBTS, PJP, INDEX, IDX, COPY) \
--- 630,636 ----
#ifdef JUDY1
#define CHECKINDEXNATIVE(LEAF_T, PJP, IDX, INDEX) \
! if (((LEAF_T *)((PJP)->jp_2Index))[(IDX) - 1] == (LEAF_T)(INDEX)) \
return(1)
#define CHECKLEAFNONNAT(LFBTS, PJP, INDEX, IDX, COPY) \
diff -crb judy-1.0.5-orig/src/JudyCommon/JudyIns.c judy-1.0.5/src/JudyCommon/JudyIns.c
*** judy-1.0.5-orig/src/JudyCommon/JudyIns.c 2005-02-15 15:06:07.000000000 -0600
--- judy-1.0.5/src/JudyCommon/JudyIns.c 2014-02-18 13:00:49.871850635 -0600
***************
*** 1503,1509 ****
JU_BITMAPSETL(Pjlb, Index);
for (offset = 0; offset < 15; ++offset)
! JU_BITMAPSETL(Pjlb, Pjp->jp_1Index[offset]);
// Set jp_DcdPopO including the current pop0; incremented later:
DcdP0 = (Index & cJU_DCDMASK(1)) + 15 - 1;
--- 1503,1510 ----
JU_BITMAPSETL(Pjlb, Index);
for (offset = 0; offset < 15; ++offset)
! // JU_BITMAPSETL(Pjlb, Pjp->jp_1Index[offset]); // elements 8..15 are optimized out by gcc, so need to do the following
! JU_BITMAPSETL(Pjlb, Pjp->jp_2Index[offset]);
// Set jp_DcdPopO including the current pop0; incremented later:
DcdP0 = (Index & cJU_DCDMASK(1)) + 15 - 1;
diff -crb judy-1.0.5-orig/src/JudyCommon/JudyPrevNext.c judy-1.0.5/src/JudyCommon/JudyPrevNext.c
*** judy-1.0.5-orig/src/JudyCommon/JudyPrevNext.c 2005-02-15 15:06:07.000000000 -0600
--- judy-1.0.5/src/JudyCommon/JudyPrevNext.c 2014-02-18 13:45:40.972875737 -0600
***************
*** 907,913 ****
// Shorthand for where to find start of Index bytes array:
#ifdef JUDY1
! #define PJI (Pjp->jp_1Index)
#else
#define PJI (Pjp->jp_LIndex)
#endif
--- 907,913 ----
// Shorthand for where to find start of Index bytes array:
#ifdef JUDY1
! #define PJI (Pjp->jp_2Index)
#else
#define PJI (Pjp->jp_LIndex)
#endif
diff -crb judy-1.0.5-orig/src/JudyCommon/JudyPrivateBranch.h judy-1.0.5/src/JudyCommon/JudyPrivateBranch.h
*** judy-1.0.5-orig/src/JudyCommon/JudyPrivateBranch.h 2005-02-15 15:06:07.000000000 -0600
--- judy-1.0.5/src/JudyCommon/JudyPrivateBranch.h 2014-02-18 13:00:39.510533765 -0600
***************
*** 86,91 ****
--- 86,98 ----
} jpi_t;
+ typedef struct _JUDY_POINTER_IMMED2 // JPI2.
+ {
+ uint8_t j_pi_2Index[2 * sizeof(Word_t) - 1]; // see above.
+ uint8_t j_pi_Type; // JP type, 1 of cJ*_JPIMMED*.
+ } jpi2_t;
+
+
// UNION OF JP TYPES:
//
// A branch is an array of cJU_BRANCHUNUMJPS (256) of this object, or an
***************
*** 97,102 ****
--- 104,110 ----
{
jpo_t j_po; // other than immediate indexes.
jpi_t j_pi; // immediate indexes.
+ jpi2_t j_pi2; // immediate indexes using j_pi_LIndex as well
} jp_t, *Pjp_t;
// For coding convenience:
***************
*** 105,110 ****
--- 113,119 ----
#define jp_1Index j_pi.j_pi_1Index // for storing Indexes in first word.
#define jp_LIndex j_pi.j_pi_LIndex // for storing Indexes in second word.
+ #define jp_2Index j_pi2.j_pi_2Index // for storing Indexes spanning both words.
#define jp_Addr j_po.j_po_Addr
//#define jp_DcdPop0 j_po.jpo_u.j_po_DcdPop0
#define jp_Type j_po.jpo_u.j_po_Bytes[sizeof(Word_t) - 1]

View File

@ -1,6 +1,6 @@
Name: Judy
Version: 1.0.5
Release: 7%{?dist}
Release: 8%{?dist}
Summary: General purpose dynamic array
Group: System Environment/Libraries
License: LGPLv2+
@ -12,7 +12,9 @@ Patch0: Judy-1.0.4-test-shared.patch
# The J1* man pages were incorrectly being symlinked to Judy, rather than Judy1
# This patch corrects that; submitted upstream 2008/11/27
Patch1: Judy-1.0.4-fix-Judy1-mans.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
# Fix some code with undefined behavior, commented on and removed by gcc
Patch2: Judy-1.0.5-undefined-behavior.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(id -nu)
%description
Judy is a C library that provides a state-of-the-art core technology
@ -39,9 +41,11 @@ for developing applications that use the Judy library.
%setup -q -n judy-%{version}
%patch0 -p1 -b .test-shared
%patch1 -p1 -b .fix-Judy1-mans
%patch2 -p1 -b .behavior
cp -p %{SOURCE1} .
%build
export CFLAGS="%{optflags} -fno-strict-aliasing -fno-tree-ccp -fno-tree-dominator-opts -fno-tree-copy-prop -fno-tree-vrp"
%configure --disable-static
make
#%{?_smp_mflags}
@ -84,6 +88,12 @@ rm -rf %{buildroot}
%postun -p /sbin/ldconfig
%changelog
* Tue Feb 18 2014 Paul Howarth <paul@city-fan.org> - 1.0.5-8
- Fix some code with undefined behavior
- Build with -fno-strict-aliasing
- Disable various compiler tree optimizations that trigger reproducible
crashes in gtkwave without generating compiler warnings (#1064090)
* Fri Aug 02 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.0.5-7
- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
@ -96,40 +106,40 @@ rm -rf %{buildroot}
* Thu Jan 12 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.0.5-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
* Fri Jan 6 2012 Paul Howarth <paul@city-fan.org> 1.0.5-3
- rebuilt for gcc 4.7
* Fri Jan 6 2012 Paul Howarth <paul@city-fan.org> - 1.0.5-3
- Rebuilt for gcc 4.7
* Mon Feb 7 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> 1.0.5-2
- rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
* Mon Feb 7 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.0.5-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
* Sun Jul 18 2010 Paul Howarth <paul@city-fan.org> 1.0.5-1
- update to 1.0.5
- added proper clean targets to enable multiple builds
- added examples directory
- correctly detects 32/64-bit build environment
- allow explicit configure for 32/64-bit environment
- cosmetic spec file clean-ups
* Sun Jul 18 2010 Paul Howarth <paul@city-fan.org> - 1.0.5-1
- Update to 1.0.5
- Added proper clean targets to enable multiple builds
- Added examples directory
- Correctly detects 32/64-bit build environment
- Allow explicit configure for 32/64-bit environment
- Cosmetic spec file clean-ups
* Fri Jul 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> 1.0.4-6
- rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
* Fri Jul 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.0.4-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild
* Mon Feb 23 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> 1.0.4-5
- rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
* Mon Feb 23 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1.0.4-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
* Sat Dec 13 2008 Charles R. Anderson <cra@wpi.edu> 1.0.4-4
- for Judy1 man page fix, patch Makefile.{am,in} instead of
* Sat Dec 13 2008 Charles R. Anderson <cra@wpi.edu> - 1.0.4-4
- For Judy1 man page fix, patch Makefile.{am,in} instead of
relying on autotools to regenerate the latter
- add README.Fedora with upstream's license explanation
- Add README.Fedora with upstream's license explanation
* Sun Nov 30 2008 Charles R. Anderson <cra@wpi.edu> 1.0.4-3
- fix Judy1 man page symlinks
- use valid tag License: LGPLv2+ confirmed with upstream
- use version macro in Source0
- remove Makefiles from installed doc tree
* Sun Nov 30 2008 Charles R. Anderson <cra@wpi.edu> - 1.0.4-3
- Fix Judy1 man page symlinks
- Use valid tag License: LGPLv2+ confirmed with upstream
- Use version macro in Source0
- Remove Makefiles from installed doc tree
* Thu Nov 27 2008 Charles R. Anderson <cra@wpi.edu> 1.0.4-2
- patch tests to run with shared library
- run tests in check section
* Thu Nov 27 2008 Charles R. Anderson <cra@wpi.edu> - 1.0.4-2
- Patch tests to run with shared library
- Run tests in check section
* Sun Oct 05 2008 Charles R. Anderson <cra@wpi.edu> 1.0.4-1
- initial package for Fedora
* Sun Oct 05 2008 Charles R. Anderson <cra@wpi.edu> - 1.0.4-1
- Initial package for Fedora