[tarantool-patches] [PATCH v1] Fix LTO in travis-ci

Alexander V. Tikhonov avtikhon at tarantool.org
Wed May 15 20:31:44 MSK 2019


Made fixes:

- Added CMAKE_EXTRA_PARAMS environment to docker's container
  runs to enable -DENABLE_LTO=ON/OFF cmake option.

- Added CC/CXX environment to docker's container runs to set
  clang for cmake.

- Changed LTO docker's image to 'debian-buster' due to LTO needed
  higher versions of packages, check for more information commit:

    commit f9e28ce4602aff3f9bb4e743b0d6167b0f8df88d
    Author: AKhatskevich <avkhatskevich at tarantool.org>
    Date:   Thu Mar 22 11:37:06 2018 +0300

- Fixed sources to avoid of failures on builds with LTO:

1)  src/box/memtx_rtree.c: In function ‘mp_decode_rect’:
    src/box/memtx_rtree.c:86:24: error: ‘c’ may be used uninitialized
      in this function [-Werror=maybe-uninitialized]
        rect->coords[i * 2] = c;
                            ^
    src/box/memtx_rtree.c:74:10: note: ‘c’ was declared here
      coord_t c;
              ^

2)  src/box/sql/func.c: In function ‘quoteFunc’:
    src/box/sql/func.c:1103:3: error: ‘b’ may be used uninitialized
      in this function [-Werror=maybe-uninitialized]
       sql_result_text(context, sql_value_boolean(argv[0]) ?
       ^
    src/box/sql/vdbeapi.c:217:7: note: ‘b’ was declared here
      bool b;
           ^

3)  src/box/tuple_update.c: In function ‘update_read_ops’:
    src/box/tuple_update.c:1022:4: error: ‘field_no’ may be used
      uninitialized in this function [-Werror=maybe-uninitialized]
        diag_set(ClientError, ER_NO_SUCH_FIELD_NO, field_no);
        ^
    src/box/tuple_update.c:1014:11: note: ‘field_no’ was declared here
       int32_t field_no;
               ^

4)  src/httpc.c: In function ‘httpc_set_verbose’:
    src/httpc.c:267:2: error: call to ‘_curl_easy_setopt_err_long’
      declared with attribute warning: curl_easy_setopt expects a long
      argument for this option [-Werror]
      curl_easy_setopt(req->curl_request.easy, CURLOPT_VERBOSE, curl_verbose);
      ^

5)  src/lua/httpc.c: In function ‘luaT_httpc_request’:
    src/lua/httpc.c:128:64: error: ‘MEM[(int *)&parser + 20B]’ may be used
      uninitialized in this function [-Werror=maybe-uninitialized]
      lua_pushinteger(L, (parser.http_minor > 0) ? parser.http_minor: 0);
                                                                    ^
    src/lua/httpc.c:67:21: note: ‘MEM[(int *)&parser + 20B]’ was declared here
      struct http_parser parser;
                         ^
    src/lua/httpc.c:124:64: error: ‘MEM[(int *)&parser + 16B]’ may be used
      uninitialized in this function [-Werror=maybe-uninitialized]
      lua_pushinteger(L, (parser.http_major > 0) ? parser.http_major: 0);
                                                                    ^
    src/lua/httpc.c:67:21: note: ‘MEM[(int *)&parser + 16B]’ was declared here
      struct http_parser parser;
                         ^

Close #4215
---

Github: https://github.com/tarantool/tarantool/compare/avtikhon/lto-build-fix
Issue: https://github.com/tarantool/tarantool/issues/4215

 .travis.mk             |  7 +++++--
 .travis.yml            | 10 +++++-----
 src/box/memtx_rtree.c  |  2 +-
 src/box/sql/vdbeapi.c  |  2 +-
 src/box/tuple_update.c |  2 +-
 src/httpc.c            |  2 +-
 src/lua/httpc.c        | 34 ++++++++++++++++++----------------
 7 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/.travis.mk b/.travis.mk
index 4ac3fc11a..f6458be4c 100644
--- a/.travis.mk
+++ b/.travis.mk
@@ -2,7 +2,7 @@
 # Travis CI rules
 #
 
-DOCKER_IMAGE:=packpack/packpack:debian-stretch
+DOCKER_IMAGE?=packpack/packpack:debian-stretch
 
 all: package
 
@@ -27,6 +27,9 @@ docker_%:
 		-e CCACHE_DIR=/cache/ccache \
 		-e COVERALLS_TOKEN=${COVERALLS_TOKEN} \
 		-e TRAVIS_JOB_ID=${TRAVIS_JOB_ID} \
+		-e CMAKE_EXTRA_PARAMS=${CMAKE_EXTRA_PARAMS} \
+		-e CC=${CC} \
+		-e CXX=${CXX} \
 		${DOCKER_IMAGE} \
 		make -f .travis.mk $(subst docker_,,$@)
 
@@ -37,7 +40,7 @@ deps_ubuntu:
 		libcurl4-openssl-dev libunwind-dev libicu-dev \
 		python python-pip python-setuptools python-dev \
 		python-msgpack python-yaml python-argparse python-six python-gevent \
-		lcov ruby
+		lcov ruby clang
 
 test_ubuntu: deps_ubuntu
 	cmake . -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_WERROR=ON ${CMAKE_EXTRA_PARAMS}
diff --git a/.travis.yml b/.travis.yml
index 6e79cf2fe..4b247b8d5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -37,16 +37,16 @@ jobs:
         if: branch = "master"
       # Special targets (only LTO for now).
       - name: "LTO build + test (Linux, gcc)"
-        env: TARGET=test CMAKE_EXTRA_PARAMS=-DENABLE_LTO=ON
-        if: branch = "master"
+        env: TARGET=test CMAKE_EXTRA_PARAMS=-DENABLE_LTO=ON DOCKER_IMAGE=packpack/packpack:debian-buster
+        #if: branch = "master"
       - name: "LTO build + test (Linux, clang)"
-        env: TARGET=test CMAKE_EXTRA_PARAMS=-DENABLE_LTO=ON
-        if: branch = "master"
+        env: TARGET=test CMAKE_EXTRA_PARAMS=-DENABLE_LTO=ON DOCKER_IMAGE=packpack/packpack:debian-buster
+        #if: branch = "master"
         compiler: clang
       - name: "LTO build + test (OS X Mojave 10.14)"
         os: osx
         env: TARGET=test CMAKE_EXTRA_PARAMS=-DENABLE_LTO=ON
-        if: branch = "master"
+        #if: branch = "master"
       # Deploy targets (they also catch distro-specific problems).
       - name: "Create and deploy tarball"
         env: TARGET=source
diff --git a/src/box/memtx_rtree.c b/src/box/memtx_rtree.c
index 45e8fb8e3..b91a405d7 100644
--- a/src/box/memtx_rtree.c
+++ b/src/box/memtx_rtree.c
@@ -71,7 +71,7 @@ static inline int
 mp_decode_rect(struct rtree_rect *rect, unsigned dimension,
 	       const char *mp, unsigned count, const char *what)
 {
-	coord_t c;
+	coord_t c = 0;
 	if (count == dimension) { /* point */
 		for (unsigned i = 0; i < dimension; i++) {
 			if (mp_decode_num(&mp, i, &c) < 0)
diff --git a/src/box/sql/vdbeapi.c b/src/box/sql/vdbeapi.c
index d2868567b..04083914a 100644
--- a/src/box/sql/vdbeapi.c
+++ b/src/box/sql/vdbeapi.c
@@ -214,7 +214,7 @@ sql_value_double(sql_value * pVal)
 bool
 sql_value_boolean(sql_value *val)
 {
-	bool b;
+	bool b = false;
 	mem_value_bool((struct Mem *) val, &b);
 	return b;
 }
diff --git a/src/box/tuple_update.c b/src/box/tuple_update.c
index 849073258..7a203ced8 100644
--- a/src/box/tuple_update.c
+++ b/src/box/tuple_update.c
@@ -1011,7 +1011,7 @@ update_read_ops(struct tuple_update *update, const char *expr,
 				 "field id must be a number");
 			return -1;
 		}
-		int32_t field_no;
+		int32_t field_no = 0;
 		if (mp_read_i32(update->index_base, op, &expr, &field_no))
 			return -1;
 		if (field_no - update->index_base >= 0) {
diff --git a/src/httpc.c b/src/httpc.c
index 80dabd59c..813a3e387 100644
--- a/src/httpc.c
+++ b/src/httpc.c
@@ -267,7 +267,7 @@ httpc_set_low_speed_limit(struct httpc_request *req, long low_speed_limit)
 void
 httpc_set_verbose(struct httpc_request *req, bool curl_verbose)
 {
-	curl_easy_setopt(req->curl_request.easy, CURLOPT_VERBOSE, curl_verbose);
+	curl_easy_setopt(req->curl_request.easy, CURLOPT_VERBOSE, (long) curl_verbose);
 }
 
 void
diff --git a/src/lua/httpc.c b/src/lua/httpc.c
index c39a2f0de..c174ffce0 100644
--- a/src/lua/httpc.c
+++ b/src/lua/httpc.c
@@ -64,9 +64,10 @@ static int
 parse_headers(lua_State *L, char *buffer, size_t len,
 	      int max_header_name_len)
 {
-	struct http_parser parser;
-	parser.hdr_name = (char *) calloc(max_header_name_len, sizeof(char));
-	if (parser.hdr_name == NULL) {
+	struct http_parser *parser = (struct http_parser *)
+		malloc(sizeof(*parser));
+	parser->hdr_name = (char *) calloc(max_header_name_len, sizeof(char));
+	if (parser->hdr_name == NULL) {
 		diag_set(OutOfMemory, max_header_name_len * sizeof(char),
 			 "malloc", "hdr_name");
 		return -1;
@@ -75,7 +76,7 @@ parse_headers(lua_State *L, char *buffer, size_t len,
 	lua_pushstring(L, "headers");
 	lua_newtable(L);
 	while (true) {
-		int rc = http_parse_header_line(&parser, &buffer, end_buf,
+		int rc = http_parse_header_line(parser, &buffer, end_buf,
 						max_header_name_len);
 		if (rc == HTTP_PARSE_INVALID || rc == HTTP_PARSE_CONTINUE) {
 			continue;
@@ -84,35 +85,35 @@ parse_headers(lua_State *L, char *buffer, size_t len,
 			break;
 		}
 		if (rc == HTTP_PARSE_OK) {
-			lua_pushlstring(L, parser.hdr_name,
-					parser.hdr_name_idx);
+			lua_pushlstring(L, parser->hdr_name,
+					parser->hdr_name_idx);
 
 			/* check value of header, if exists */
-			lua_pushlstring(L, parser.hdr_name,
-					parser.hdr_name_idx);
+			lua_pushlstring(L, parser->hdr_name,
+					parser->hdr_name_idx);
 			lua_gettable(L, -3);
-			int value_len = parser.hdr_value_end -
-						parser.hdr_value_start;
+			int value_len = parser->hdr_value_end -
+						parser->hdr_value_start;
 			/* table of values to handle duplicates*/
 			if (lua_isnil(L, -1)) {
 				lua_pop(L, 1);
 				lua_newtable(L);
 				lua_pushinteger(L, 1);
-				lua_pushlstring(L, parser.hdr_value_start,
+				lua_pushlstring(L, parser->hdr_value_start,
 						value_len);
 				lua_settable(L, -3);
 			} else if (lua_istable(L, -1)) {
 				lua_pushinteger(L, lua_objlen(L, -1) + 1);
-				lua_pushlstring(L, parser.hdr_value_start,
+				lua_pushlstring(L, parser->hdr_value_start,
 						value_len);
 				lua_settable(L, -3);
 			}
-			/*headers[parser.header] = {value}*/
+			/*headers[parser->header] = {value}*/
 			lua_settable(L, -3);
 		}
 	}
 
-	free(parser.hdr_name);
+	free(parser->hdr_name);
 
 	/* headers */
 	lua_settable(L, -3);
@@ -121,15 +122,16 @@ parse_headers(lua_State *L, char *buffer, size_t len,
 
 	lua_newtable(L);
 	lua_pushinteger(L, 1);
-	lua_pushinteger(L, (parser.http_major > 0) ? parser.http_major: 0);
+	lua_pushinteger(L, (parser->http_major > 0) ? parser->http_major: 0);
 	lua_settable(L, -3);
 
 	lua_pushinteger(L, 2);
-	lua_pushinteger(L, (parser.http_minor > 0) ? parser.http_minor: 0);
+	lua_pushinteger(L, (parser->http_minor > 0) ? parser->http_minor: 0);
 	lua_settable(L, -3);
 
 	/* proto */
 	lua_settable(L, -3);
+	free(parser);
 	return 0;
 }
 /* }}}
-- 
2.17.1





More information about the Tarantool-patches mailing list