Bug Summary

File:testsuite/ctk/recentmanager.c
Warning:line 58, column 7
Value stored to 'res' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name recentmanager.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/testsuite/ctk -resource-dir /usr/lib/llvm-16/lib/clang/16 -D HAVE_CONFIG_H -I . -I ../.. -D CTK_LOCALEDIR="/usr/share/locale" -I ../.. -I ../../cdk -I ../../cdk -I ../../ctk -I ../../ctk -D G_ENABLE_DEBUG -D G_ENABLE_CONSISTENCY_CHECKS -D GLIB_MIN_REQUIRED_VERSION=GLIB_VERSION_2_66 -D GLIB_MAX_ALLOWED_VERSION=GLIB_VERSION_2_66 -I /usr/include/pango-1.0 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/atk-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -I /usr/include/gio-unix-2.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/pango-1.0 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -D HAVE_UNIX_PRINT_WIDGETS -internal-isystem /usr/lib/llvm-16/lib/clang/16/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdebug-compilation-dir=/rootdir/testsuite/ctk -ferror-limit 19 -fgnuc-version=4.2.1 -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-09-19-172131-43638-1 -x c recentmanager.c
1/* CTK - The GIMP Toolkit
2 * ctkrecentmanager.c: a manager for the recently used resources
3 *
4 * Copyright (C) 2006 Emmanuele Bassi
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include <glib/gstdio.h>
21#include <ctk/ctk.h>
22
23const gchar *uri = "file:///tmp/testrecentchooser.txt";
24const gchar *uri2 = "file:///tmp/testrecentchooser2.txt";
25
26static void
27recent_manager_get_default (void)
28{
29 CtkRecentManager *manager;
30 CtkRecentManager *manager2;
31
32 manager = ctk_recent_manager_get_default ();
33 g_assert (manager != NULL)do { if (manager != ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "recentmanager.c", 33, ((const char*) (__func__
)), "manager != NULL"); } while (0)
;
34
35 manager2 = ctk_recent_manager_get_default ();
36 g_assert (manager == manager2)do { if (manager == manager2) ; else g_assertion_message_expr
(((gchar*) 0), "recentmanager.c", 36, ((const char*) (__func__
)), "manager == manager2"); } while (0)
;
37}
38
39static void
40recent_manager_add (void)
41{
42 CtkRecentManager *manager;
43 CtkRecentData *recent_data;
44 gboolean res;
45
46 manager = ctk_recent_manager_get_default ();
47
48 recent_data = g_slice_new0 (CtkRecentData)((CtkRecentData*) g_slice_alloc0 (sizeof (CtkRecentData)));
49
50 G_GNUC_BEGIN_IGNORE_DEPRECATIONSclang diagnostic push clang diagnostic ignored "-Wdeprecated-declarations"
;
51
52 /* mime type is mandatory */
53 recent_data->mime_type = NULL((void*)0);
54 recent_data->app_name = "testrecentchooser";
55 recent_data->app_exec = "testrecentchooser %u";
56 if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
57 {
58 res = ctk_recent_manager_add_full (manager,
Value stored to 'res' is never read
59 uri,
60 recent_data);
61 }
62 g_test_trap_assert_failed ()g_test_trap_assertions (((gchar*) 0), "recentmanager.c", 62, (
(const char*) (__func__)), 1, 0)
;
63
64 /* app name is mandatory */
65 recent_data->mime_type = "text/plain";
66 recent_data->app_name = NULL((void*)0);
67 recent_data->app_exec = "testrecentchooser %u";
68 if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
69 {
70 res = ctk_recent_manager_add_full (manager,
71 uri,
72 recent_data);
73 }
74 g_test_trap_assert_failed ()g_test_trap_assertions (((gchar*) 0), "recentmanager.c", 74, (
(const char*) (__func__)), 1, 0)
;
75
76 /* app exec is mandatory */
77 recent_data->mime_type = "text/plain";
78 recent_data->app_name = "testrecentchooser";
79 recent_data->app_exec = NULL((void*)0);
80 if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
81 {
82 res = ctk_recent_manager_add_full (manager,
83 uri,
84 recent_data);
85 }
86 g_test_trap_assert_failed ()g_test_trap_assertions (((gchar*) 0), "recentmanager.c", 86, (
(const char*) (__func__)), 1, 0)
;
87
88 G_GNUC_END_IGNORE_DEPRECATIONSclang diagnostic pop ;
89
90 recent_data->mime_type = "text/plain";
91 recent_data->app_name = "testrecentchooser";
92 recent_data->app_exec = "testrecentchooser %u";
93 res = ctk_recent_manager_add_full (manager,
94 uri,
95 recent_data);
96 g_assert (res == TRUE)do { if (res == (!(0))) ; else g_assertion_message_expr (((gchar
*) 0), "recentmanager.c", 96, ((const char*) (__func__)), "res == TRUE"
); } while (0)
;
97
98 g_slice_free (CtkRecentData, recent_data)do { if (1) g_slice_free1 (sizeof (CtkRecentData), (recent_data
)); else (void) ((CtkRecentData*) 0 == (recent_data)); } while
(0)
;
99}
100
101typedef struct {
102 GMainLoop *main_loop;
103 gint counter;
104} AddManyClosure;
105
106static void
107check_bulk (CtkRecentManager *manager,
108 gpointer data)
109{
110 AddManyClosure *closure = data;
111
112 if (g_test_verbose ()(g_test_config_vars->test_verbose))
113 g_print (G_STRLOC"recentmanager.c" ":" "113" ": counter = %d\n", closure->counter);
114
115 g_assert_cmpint (closure->counter, ==, 100)do { gint64 __n1 = (closure->counter), __n2 = (100); if (__n1
== __n2) ; else g_assertion_message_cmpint (((gchar*) 0), "recentmanager.c"
, 115, ((const char*) (__func__)), "closure->counter" " " "=="
" " "100", (guint64)__n1, "==", (guint64)__n2, 'i'); } while
(0)
;
116
117 if (g_main_loop_is_running (closure->main_loop))
118 g_main_loop_quit (closure->main_loop);
119}
120
121static void
122recent_manager_add_many (void)
123{
124 CtkRecentManager *manager = g_object_new (CTK_TYPE_RECENT_MANAGER(ctk_recent_manager_get_type ()),
125 "filename", "recently-used.xbel",
126 NULL((void*)0));
127 AddManyClosure *closure = g_new (AddManyClosure, 1)((AddManyClosure *) g_malloc_n ((1), sizeof (AddManyClosure))
)
;
128 CtkRecentData *data = g_slice_new0 (CtkRecentData)((CtkRecentData*) g_slice_alloc0 (sizeof (CtkRecentData)));
129 gint i;
130
131 closure->main_loop = g_main_loop_new (NULL((void*)0), FALSE(0));
132 closure->counter = 0;
133
134 g_signal_connect (manager, "changed", G_CALLBACK (check_bulk), closure)g_signal_connect_data ((manager), ("changed"), (((GCallback) (
check_bulk))), (closure), ((void*)0), (GConnectFlags) 0)
;
135
136 for (i = 0; i < 100; i++)
137 {
138 gchar *new_uri;
139
140 data->mime_type = "text/plain";
141 data->app_name = "testrecentchooser";
142 data->app_exec = "testrecentchooser %u";
143
144 if (g_test_verbose ()(g_test_config_vars->test_verbose))
145 g_print (G_STRLOC"recentmanager.c" ":" "145" ": adding item %d\n", i);
146
147 new_uri = g_strdup_printf ("file:///doesnotexist-%d.txt", i);
148 ctk_recent_manager_add_full (manager, new_uri, data);
149 g_free (new_uri);
150
151 closure->counter += 1;
152 }
153
154 g_main_loop_run (closure->main_loop);
155
156 g_main_loop_unref (closure->main_loop);
157 g_slice_free (CtkRecentData, data)do { if (1) g_slice_free1 (sizeof (CtkRecentData), (data)); else
(void) ((CtkRecentData*) 0 == (data)); } while (0)
;
158 g_free (closure);
159 g_object_unref (manager);
160
161 g_assert_cmpint (g_unlink ("recently-used.xbel"), ==, 0)do { gint64 __n1 = (g_unlink ("recently-used.xbel")), __n2 = (
0); if (__n1 == __n2) ; else g_assertion_message_cmpint (((gchar
*) 0), "recentmanager.c", 161, ((const char*) (__func__)), "g_unlink (\"recently-used.xbel\")"
" " "==" " " "0", (guint64)__n1, "==", (guint64)__n2, 'i'); }
while (0)
;
162}
163
164static void
165recent_manager_has_item (void)
166{
167 CtkRecentManager *manager;
168 gboolean res;
169
170 manager = ctk_recent_manager_get_default ();
171
172 res = ctk_recent_manager_has_item (manager, "file:///tmp/testrecentdoesnotexist.txt");
173 g_assert (res == FALSE)do { if (res == (0)) ; else g_assertion_message_expr (((gchar
*) 0), "recentmanager.c", 173, ((const char*) (__func__)), "res == FALSE"
); } while (0)
;
174
175 res = ctk_recent_manager_has_item (manager, uri);
176 g_assert (res == TRUE)do { if (res == (!(0))) ; else g_assertion_message_expr (((gchar
*) 0), "recentmanager.c", 176, ((const char*) (__func__)), "res == TRUE"
); } while (0)
;
177}
178
179static void
180recent_manager_move_item (void)
181{
182 CtkRecentManager *manager;
183 gboolean res;
184 GError *error;
185
186 manager = ctk_recent_manager_get_default ();
187
188 error = NULL((void*)0);
189 res = ctk_recent_manager_move_item (manager,
190 "file:///tmp/testrecentdoesnotexist.txt",
191 uri2,
192 &error);
193 g_assert (res == FALSE)do { if (res == (0)) ; else g_assertion_message_expr (((gchar
*) 0), "recentmanager.c", 193, ((const char*) (__func__)), "res == FALSE"
); } while (0)
;
194 g_assert (error != NULL)do { if (error != ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "recentmanager.c", 194, ((const char*) (__func__
)), "error != NULL"); } while (0)
;
195 g_assert (error->domain == CTK_RECENT_MANAGER_ERROR)do { if (error->domain == (ctk_recent_manager_error_quark (
))) ; else g_assertion_message_expr (((gchar*) 0), "recentmanager.c"
, 195, ((const char*) (__func__)), "error->domain == CTK_RECENT_MANAGER_ERROR"
); } while (0)
;
196 g_assert (error->code == CTK_RECENT_MANAGER_ERROR_NOT_FOUND)do { if (error->code == CTK_RECENT_MANAGER_ERROR_NOT_FOUND
) ; else g_assertion_message_expr (((gchar*) 0), "recentmanager.c"
, 196, ((const char*) (__func__)), "error->code == CTK_RECENT_MANAGER_ERROR_NOT_FOUND"
); } while (0)
;
197 g_error_free (error);
198
199 error = NULL((void*)0);
200 res = ctk_recent_manager_move_item (manager, uri, uri2, &error);
201 g_assert (res == TRUE)do { if (res == (!(0))) ; else g_assertion_message_expr (((gchar
*) 0), "recentmanager.c", 201, ((const char*) (__func__)), "res == TRUE"
); } while (0)
;
202 g_assert (error == NULL)do { if (error == ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "recentmanager.c", 202, ((const char*) (__func__
)), "error == NULL"); } while (0)
;
203
204 res = ctk_recent_manager_has_item (manager, uri);
205 g_assert (res == FALSE)do { if (res == (0)) ; else g_assertion_message_expr (((gchar
*) 0), "recentmanager.c", 205, ((const char*) (__func__)), "res == FALSE"
); } while (0)
;
206
207 res = ctk_recent_manager_has_item (manager, uri2);
208 g_assert (res == TRUE)do { if (res == (!(0))) ; else g_assertion_message_expr (((gchar
*) 0), "recentmanager.c", 208, ((const char*) (__func__)), "res == TRUE"
); } while (0)
;
209}
210
211static void
212recent_manager_lookup_item (void)
213{
214 CtkRecentManager *manager;
215 CtkRecentInfo *info;
216 GError *error;
217
218 manager = ctk_recent_manager_get_default ();
219
220 error = NULL((void*)0);
221 info = ctk_recent_manager_lookup_item (manager,
222 "file:///tmp/testrecentdoesnotexist.txt",
223 &error);
224 g_assert (info == NULL)do { if (info == ((void*)0)) ; else g_assertion_message_expr (
((gchar*) 0), "recentmanager.c", 224, ((const char*) (__func__
)), "info == NULL"); } while (0)
;
225 g_assert (error != NULL)do { if (error != ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "recentmanager.c", 225, ((const char*) (__func__
)), "error != NULL"); } while (0)
;
226 g_assert (error->domain == CTK_RECENT_MANAGER_ERROR)do { if (error->domain == (ctk_recent_manager_error_quark (
))) ; else g_assertion_message_expr (((gchar*) 0), "recentmanager.c"
, 226, ((const char*) (__func__)), "error->domain == CTK_RECENT_MANAGER_ERROR"
); } while (0)
;
227 g_assert (error->code == CTK_RECENT_MANAGER_ERROR_NOT_FOUND)do { if (error->code == CTK_RECENT_MANAGER_ERROR_NOT_FOUND
) ; else g_assertion_message_expr (((gchar*) 0), "recentmanager.c"
, 227, ((const char*) (__func__)), "error->code == CTK_RECENT_MANAGER_ERROR_NOT_FOUND"
); } while (0)
;
228 g_error_free (error);
229
230 error = NULL((void*)0);
231 info = ctk_recent_manager_lookup_item (manager, uri2, &error);
232 g_assert (info != NULL)do { if (info != ((void*)0)) ; else g_assertion_message_expr (
((gchar*) 0), "recentmanager.c", 232, ((const char*) (__func__
)), "info != NULL"); } while (0)
;
233 g_assert (error == NULL)do { if (error == ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "recentmanager.c", 233, ((const char*) (__func__
)), "error == NULL"); } while (0)
;
234
235 g_assert (ctk_recent_info_has_application (info, "testrecentchooser"))do { if (ctk_recent_info_has_application (info, "testrecentchooser"
)) ; else g_assertion_message_expr (((gchar*) 0), "recentmanager.c"
, 235, ((const char*) (__func__)), "ctk_recent_info_has_application (info, \"testrecentchooser\")"
); } while (0)
;
236
237 ctk_recent_info_unref (info);
238}
239
240static void
241recent_manager_remove_item (void)
242{
243 CtkRecentManager *manager;
244 gboolean res;
245 GError *error;
246
247 manager = ctk_recent_manager_get_default ();
248
249 error = NULL((void*)0);
250 res = ctk_recent_manager_remove_item (manager,
251 "file:///tmp/testrecentdoesnotexist.txt",
252 &error);
253 g_assert (res == FALSE)do { if (res == (0)) ; else g_assertion_message_expr (((gchar
*) 0), "recentmanager.c", 253, ((const char*) (__func__)), "res == FALSE"
); } while (0)
;
254 g_assert (error != NULL)do { if (error != ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "recentmanager.c", 254, ((const char*) (__func__
)), "error != NULL"); } while (0)
;
255 g_assert (error->domain == CTK_RECENT_MANAGER_ERROR)do { if (error->domain == (ctk_recent_manager_error_quark (
))) ; else g_assertion_message_expr (((gchar*) 0), "recentmanager.c"
, 255, ((const char*) (__func__)), "error->domain == CTK_RECENT_MANAGER_ERROR"
); } while (0)
;
256 g_assert (error->code == CTK_RECENT_MANAGER_ERROR_NOT_FOUND)do { if (error->code == CTK_RECENT_MANAGER_ERROR_NOT_FOUND
) ; else g_assertion_message_expr (((gchar*) 0), "recentmanager.c"
, 256, ((const char*) (__func__)), "error->code == CTK_RECENT_MANAGER_ERROR_NOT_FOUND"
); } while (0)
;
257 g_error_free (error);
258
259 /* remove an item that's actually there */
260 error = NULL((void*)0);
261 res = ctk_recent_manager_remove_item (manager, uri2, &error);
262 g_assert (res == TRUE)do { if (res == (!(0))) ; else g_assertion_message_expr (((gchar
*) 0), "recentmanager.c", 262, ((const char*) (__func__)), "res == TRUE"
); } while (0)
;
263 g_assert (error == NULL)do { if (error == ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "recentmanager.c", 263, ((const char*) (__func__
)), "error == NULL"); } while (0)
;
264
265 res = ctk_recent_manager_has_item (manager, uri2);
266 g_assert (res == FALSE)do { if (res == (0)) ; else g_assertion_message_expr (((gchar
*) 0), "recentmanager.c", 266, ((const char*) (__func__)), "res == FALSE"
); } while (0)
;
267}
268
269static void
270recent_manager_purge (void)
271{
272 CtkRecentManager *manager;
273 CtkRecentData *recent_data;
274 gint n;
275 GError *error;
276
277 manager = ctk_recent_manager_get_default ();
278
279 /* purge, add 1, purge again and check that 1 item has been purged */
280 error = NULL((void*)0);
281 n = ctk_recent_manager_purge_items (manager, &error);
282 g_assert (error == NULL)do { if (error == ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "recentmanager.c", 282, ((const char*) (__func__
)), "error == NULL"); } while (0)
;
283
284 recent_data = g_slice_new0 (CtkRecentData)((CtkRecentData*) g_slice_alloc0 (sizeof (CtkRecentData)));
285 recent_data->mime_type = "text/plain";
286 recent_data->app_name = "testrecentchooser";
287 recent_data->app_exec = "testrecentchooser %u";
288 ctk_recent_manager_add_full (manager, uri, recent_data);
289 g_slice_free (CtkRecentData, recent_data)do { if (1) g_slice_free1 (sizeof (CtkRecentData), (recent_data
)); else (void) ((CtkRecentData*) 0 == (recent_data)); } while
(0)
;
290
291 error = NULL((void*)0);
292 n = ctk_recent_manager_purge_items (manager, &error);
293 g_assert (error == NULL)do { if (error == ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "recentmanager.c", 293, ((const char*) (__func__
)), "error == NULL"); } while (0)
;
294 g_assert (n == 1)do { if (n == 1) ; else g_assertion_message_expr (((gchar*) 0
), "recentmanager.c", 294, ((const char*) (__func__)), "n == 1"
); } while (0)
;
295}
296
297int
298main (int argc,
299 char **argv)
300{
301 ctk_test_init (&argc, &argv, NULL((void*)0));
302
303 g_test_add_func ("/recent-manager/get-default", recent_manager_get_default);
304 g_test_add_func ("/recent-manager/add", recent_manager_add);
305 g_test_add_func ("/recent-manager/add-many", recent_manager_add_many);
306 g_test_add_func ("/recent-manager/has-item", recent_manager_has_item);
307 g_test_add_func ("/recent-manager/move-item", recent_manager_move_item);
308 g_test_add_func ("/recent-manager/lookup-item", recent_manager_lookup_item);
309 g_test_add_func ("/recent-manager/remove-item", recent_manager_remove_item);
310 g_test_add_func ("/recent-manager/purge", recent_manager_purge);
311
312 return g_test_run ();
313}