Hey Thomas,

Thanks for picking this up. I think your patch looks really good. Are you familiar with gcc's function poisoning?

        #include <stdio.h>
        #pragma GCC poison puts
        
        int main(){
        #pragma GCC bless begin puts
            puts("a");
        #pragma GCC bless end puts
        }

I wonder if we could use function poisoning to our advantage. For instance in ecpg, it looks like you got all of the strtod() invocations and replaced them with strtod_l(). Here is a patch with an example of what I'm talking about.

--
Tristan Partin
Neon (https://neon.tech)
From a76a3f2577d098f7ce5a3ed1768aca4293aedfcc Mon Sep 17 00:00:00 2001
From: Tristan Partin <tris...@partin.io>
Date: Tue, 13 Aug 2024 18:06:20 -0500
Subject: [PATCH v1] Poison strtod in ecpg

ecpg exclusively uses strtod_l now.

Signed-off-by: Tristan Partin <tris...@partin.io>
---
 src/interfaces/ecpg/ecpglib/data.c         | 1 +
 src/interfaces/ecpg/include/ecpg_poison.h  | 6 ++++++
 src/interfaces/ecpg/pgtypeslib/dt_common.c | 1 +
 src/interfaces/ecpg/pgtypeslib/interval.c  | 1 +
 src/interfaces/ecpg/pgtypeslib/numeric.c   | 1 +
 5 files changed, 10 insertions(+)
 create mode 100644 src/interfaces/ecpg/include/ecpg_poison.h

diff --git a/src/interfaces/ecpg/ecpglib/data.c b/src/interfaces/ecpg/ecpglib/data.c
index 856f4c9472d..13023fc21eb 100644
--- a/src/interfaces/ecpg/ecpglib/data.c
+++ b/src/interfaces/ecpg/ecpglib/data.c
@@ -6,6 +6,7 @@
 #include <math.h>
 
 #include "ecpgerrno.h"
+#include "ecpg_poison.h"
 #include "ecpglib.h"
 #include "ecpglib_extern.h"
 #include "ecpgtype.h"
diff --git a/src/interfaces/ecpg/include/ecpg_poison.h b/src/interfaces/ecpg/include/ecpg_poison.h
new file mode 100644
index 00000000000..97ae9d7a143
--- /dev/null
+++ b/src/interfaces/ecpg/include/ecpg_poison.h
@@ -0,0 +1,6 @@
+#ifndef _ECPG_POISON_H
+#define _ECPG_POISON_H
+
+#pragma GCC poison strtod
+
+#endif							/* !_ECPG_POISON_H */
diff --git a/src/interfaces/ecpg/pgtypeslib/dt_common.c b/src/interfaces/ecpg/pgtypeslib/dt_common.c
index 92459728bf4..2a9c5ec32c0 100644
--- a/src/interfaces/ecpg/pgtypeslib/dt_common.c
+++ b/src/interfaces/ecpg/pgtypeslib/dt_common.c
@@ -8,6 +8,7 @@
 
 #include "common/string.h"
 #include "dt.h"
+#include "ecpg_poison.h"
 #include "pgtypes_timestamp.h"
 #include "pgtypeslib_extern.h"
 
diff --git a/src/interfaces/ecpg/pgtypeslib/interval.c b/src/interfaces/ecpg/pgtypeslib/interval.c
index 155c6cc7770..bfcc7233999 100644
--- a/src/interfaces/ecpg/pgtypeslib/interval.c
+++ b/src/interfaces/ecpg/pgtypeslib/interval.c
@@ -12,6 +12,7 @@
 
 #include "common/string.h"
 #include "dt.h"
+#include "ecpg_poison.h"
 #include "pgtypes_error.h"
 #include "pgtypes_interval.h"
 #include "pgtypeslib_extern.h"
diff --git a/src/interfaces/ecpg/pgtypeslib/numeric.c b/src/interfaces/ecpg/pgtypeslib/numeric.c
index 49938543d03..2623f362565 100644
--- a/src/interfaces/ecpg/pgtypeslib/numeric.c
+++ b/src/interfaces/ecpg/pgtypeslib/numeric.c
@@ -6,6 +6,7 @@
 #include <float.h>
 #include <limits.h>
 
+#include "ecpg_poison.h"
 #include "pgtypes_error.h"
 #include "pgtypes_numeric.h"
 #include "pgtypeslib_extern.h"
-- 
Tristan Partin
https://tristan.partin.io

Reply via email to