With GCC, we can check at compilation time whether the first parameter of xxxxx_FIXED...
authorHiroshi Inoue <h-inoue@dream.email.ne.jp>
Tue, 6 Jun 2017 09:25:36 +0000 (18:25 +0900)
committerHiroshi Inoue <h-inoue@dream.email.ne.jp>
Wed, 7 Jun 2017 05:13:16 +0000 (14:13 +0900)
misc.h
mylog.c
parse.c
psqlodbc.h
tuple.c

diff --git a/misc.h b/misc.h
index b505f13cd154ce39f4f90921d87ebf529df84b40..2a3d83fbc804f56fa997884e9991b1a5dbb69cb0 100644 (file)
--- a/misc.h
+++ b/misc.h
@@ -22,10 +22,11 @@ char       *strncpy_null(char *dst, const char *src, ssize_t len);
 #ifndef    HAVE_STRLCAT
 size_t     strlcat(char *, const char *, size_t);
 #endif /* HAVE_STRLCAT */
-char      *my_trim(char *string);
-char      *make_string(const SQLCHAR *s, SQLINTEGER len, char *buf, size_t bufsize);
 int       snprintf_add(char *buf, size_t size, const char *format, ...);
 size_t    snprintf_len(char *buf, size_t size, const char *format, ...);
+
+char      *my_trim(char *string);
+char      *make_string(const SQLCHAR *s, SQLINTEGER len, char *buf, size_t bufsize);
 /* #define GET_SCHEMA_NAME(nspname)    (stricmp(nspname, "public") ? nspname : "") */
 char *quote_table(const pgNAME schema, const pgNAME table);
 
@@ -39,6 +40,64 @@ char *quote_table(const pgNAME schema, const pgNAME table);
 
 ssize_t            my_strcpy(char *dst, ssize_t dst_len, const char *src, ssize_t src_len);
 
+/*
+ * Macros to safely strcpy, strcat or sprintf to fixed arrays.
+ *
+ */
+
+/*
+ * With GCC, the macro CHECK_NOT_CHAR_P() causes a compilation error
+ *     when the target is pointer not a fixed array.
+ */
+#ifdef __GNUC__
+#define    FUNCTION_BEGIN_MACRO ({
+#define    FUNCTION_END_MACRO ;})
+#define CHECK_NOT_CHAR_P(t) \
+_Pragma ("GCC diagnostic push") \
+_Pragma ("GCC diagnostic ignored \"-Wunused-variable\"") \
+   if (0) { typeof(t) dummy_for_check = {};} \
+_Pragma ("GCC diagnostic pop")
+#else
+#define    FUNCTION_BEGIN_MACRO
+#define    FUNCTION_END_MACRO
+#define CHECK_NOT_CHAR_P(t)
+#endif
+
+/* macro to safely strcpy() to fixed arrays. */
+#define    STRCPY_FIXED(to, from) \
+FUNCTION_BEGIN_MACRO \
+   CHECK_NOT_CHAR_P(to) \
+   strncpy_null((to), (from), sizeof(to)) \
+FUNCTION_END_MACRO
+
+/* macro to safely strcat() to fixed arrays. */
+#define    STRCAT_FIXED(to, from) \
+FUNCTION_BEGIN_MACRO \
+   CHECK_NOT_CHAR_P(to) \
+   strlcat((to), (from), sizeof(to)) \
+FUNCTION_END_MACRO
+
+/* macro to safely sprintf() to fixed arrays. */
+#define    SPRINTF_FIXED(to, ...) \
+FUNCTION_BEGIN_MACRO \
+   CHECK_NOT_CHAR_P(to) \
+   snprintf((to), sizeof(to), __VA_ARGS__) \
+FUNCTION_END_MACRO
+
+/* macro to safely sprintf() & cat to fixed arrays. */
+#define    SPRINTF_FIXEDCAT(to, ...) \
+FUNCTION_BEGIN_MACRO \
+   CHECK_NOT_CHAR_P(to) \
+   snprintf_add((to), sizeof(to), __VA_ARGS__) \
+FUNCTION_END_MACRO
+
+#define    ITOA_FIXED(to, from) \
+FUNCTION_BEGIN_MACRO \
+   CHECK_NOT_CHAR_P(to) \
+   snprintf((to), sizeof(to), "%d", from) \
+FUNCTION_END_MACRO
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/mylog.c b/mylog.c
index 78f20b89431b04179ce9a0dd31b4c53aa61d6552..13ac9d2be1033b37374b56377715ef50bd4a21fc 100644 (file)
--- a/mylog.c
+++ b/mylog.c
@@ -15,6 +15,7 @@
 #define    _MYLOG_FUNCS_IMPLEMENT_
 #include "psqlodbc.h"
 #include "dlg_specific.h"
+#include "misc.h"
 
 #include <stdio.h>
 #include <stdlib.h>
diff --git a/parse.c b/parse.c
index 4f6ef648bfd37886c464f784756935cd33afa1b3..484637590e012dbd8ddc3a105876a6dd2011e9cb 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -1306,7 +1306,7 @@ parse_the_statement(StatementClass *stmt, BOOL check_hasoids, BOOL sqlsvr_check)
 
    delim = '\0';
    token[0] = '\0';
-   while (pptr = ptr, (delim != ',') ? strncpy_null(btoken, token, sizeof(btoken)) : (btoken[0] = '\0', NULL), (ptr = getNextToken(conn->ccsc, CC_get_escape(conn), pptr, token, sizeof(token), &delim, &quote, &dquote, &numeric)) != NULL)
+   while (pptr = ptr, (delim != ',') ? STRCPY_FIXED(btoken, token) : (btoken[0] = '\0', NULL), (ptr = getNextToken(conn->ccsc, CC_get_escape(conn), pptr, token, sizeof(token), &delim, &quote, &dquote, &numeric)) != NULL)
    {
        unquoted = !(quote || dquote);
 
index 7c6db421fde086fb8034093575fadf746c464d77..4338b4822ef97275a1d611a72254f176f35db898 100644 (file)
@@ -466,12 +466,6 @@ do { \
 #define    NAMEICMP(name1, name2) (stricmp(SAFE_NAME(name1), SAFE_NAME(name2)))
 /* pgNAME define end */
 
-/* macro to strcpy() or strcat() to fixed arrays. */
-#define    STRCPY_FIXED(to, from) strncpy_null((to), (from), sizeof(to))
-#define    STRCAT_FIXED(to, from) strlcat((to), (from), sizeof(to))
-/* macro to sprintfy() to fixed arrays. */
-#define    SPRINTF_FIXED(to, ...) snprintf((to), sizeof(to), __VA_ARGS__)
-#define    ITOA_FIXED(to, from) snprintf((to), sizeof(to), "%d", from)
 
 typedef struct GlobalValues_
 {
diff --git a/tuple.c b/tuple.c
index 6c0f76dd7e73c6ca2b531be5216d111ea09b7260..42ab71bbd9d27d3692650a1b920f16ce405801c4 100644 (file)
--- a/tuple.c
+++ b/tuple.c
@@ -18,6 +18,7 @@
  */
 
 #include "tuple.h"
+#include "misc.h"
 
 #include <string.h>
 #include <stdlib.h>