summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-04-11 21:49:54 +0200
committerMattias Andrée <maandree@operamail.com>2014-04-11 21:49:54 +0200
commit80a321118cc46c357a317b8668998d13f8c8b062 (patch)
tree81f43a1eb00fb48d78568a3cc71ee77e955ba80b
parenthotplugging does work, can operate on CRTC:s without any attached monitors (diff)
downloadblueshift-80a321118cc46c357a317b8668998d13f8c8b062.tar.gz
blueshift-80a321118cc46c357a317b8668998d13f8c8b062.tar.bz2
blueshift-80a321118cc46c357a317b8668998d13f8c8b062.tar.xz
add more warnings
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rw-r--r--Makefile16
-rw-r--r--src/blueshift_drm_c.c12
-rw-r--r--src/blueshift_drm_c.h14
-rw-r--r--src/blueshift_iccprofile.c12
-rw-r--r--src/blueshift_idcrtc.c10
-rw-r--r--src/blueshift_randr_c.c22
-rw-r--r--src/blueshift_randr_c.h6
7 files changed, 55 insertions, 37 deletions
diff --git a/Makefile b/Makefile
index 0e35ba6..a57712a 100644
--- a/Makefile
+++ b/Makefile
@@ -49,13 +49,17 @@ PKGCONFIG ?= pkg-config
OPTIMISE ?= -Og -g
# Warnings settings for C code compilation
WARN = -Wall -Wextra -pedantic -Wdouble-promotion -Wformat=2 -Winit-self -Wmissing-include-dirs \
- -Wfloat-equal -Wmissing-prototypes -Wmissing-declarations -Wtrampolines -Wnested-externs \
- -Wno-variadic-macros -Wdeclaration-after-statement -Wundef -Wpacked -Wunsafe-loop-optimizations \
- -Wbad-function-cast -Wwrite-strings -Wlogical-op -Wstrict-prototypes -Wold-style-definition \
- -Wvector-operation-performance -Wstack-protector -Wunsuffixed-float-constants -Wcast-align \
- -Wsync-nand
+ -Wtrampolines -Wfloat-equal -Wmissing-prototypes -Wmissing-declarations -Wnested-externs \
+ -Wno-variadic-macros -Wsync-nand -Wunsafe-loop-optimizations -Wcast-align \
+ -Wdeclaration-after-statement -Wundef -Wbad-function-cast -Wwrite-strings -Wlogical-op \
+ -Wstrict-prototypes -Wold-style-definition -Wpacked -Wvector-operation-performance \
+ -Wunsuffixed-float-constants -Wsuggest-attribute=const -Wsuggest-attribute=noreturn \
+ -Wsuggest-attribute=format -Wnormalized=nfkc
# Warnings violated by Cython and therefore only use for C and not Cython
-CWARN = -Wshadow -Wredundant-decls -Winline -Wcast-qual -Wsign-conversion -Wstrict-overflow
+CWARN = -Wshadow -Wredundant-decls -Winline -Wcast-qual -Wsign-conversion -Wstrict-overflow \
+ -Wconversion -Wsuggest-attribute=pure
+#not used: -Wtraditional (tranditional C function definitions are ridiculous)
+#not used because of libxcb's API: -Waggregate-return, -Wtraditional-conversion (also useless)
# The C standard for C code compilation
STD = c99
LIBS_idcrtc = xcb-randr
diff --git a/src/blueshift_drm_c.c b/src/blueshift_drm_c.c
index 368991a..a900685 100644
--- a/src/blueshift_drm_c.c
+++ b/src/blueshift_drm_c.c
@@ -114,14 +114,14 @@ int blueshift_drm_open_card(int card_index)
}
if (card_connection_reuse_ptr)
- rc = *(card_connection_reusables + --card_connection_reuse_ptr);
+ rc = (int)*(card_connection_reusables + --card_connection_reuse_ptr);
else
{
if (card_connection_size == 0)
card_connections = malloc((card_connection_size = 8) * sizeof(card_connection));
else if (card_connection_ptr == card_connection_size)
card_connections = realloc(card_connections, (card_connection_size <<= 1) * sizeof(card_connection));
- rc = card_connection_ptr++;
+ rc = (int)(card_connection_ptr++);
}
(card_connections + rc)->fd = fd;
@@ -162,7 +162,7 @@ void blueshift_drm_close_card(int connection)
free(card->connectors);
close(card->fd);
- if ((size_t)connection + 1U == card_connection_reuse_ptr)
+ if ((size_t)connection + 1 == card_connection_reuse_ptr)
card_connection_reuse_ptr--;
else
{
@@ -422,10 +422,10 @@ long blueshift_drm_get_edid(int connection, int connector_index, char* edid, lon
drmModePropertyRes* prop = drmModeGetProperty(fd, connector->props[prop_i]);
if (!strcmp("EDID", prop->name))
{
- drmModePropertyBlobRes* blob = drmModeGetPropertyBlob(fd, connector->prop_values[prop_i]);
+ drmModePropertyBlobRes* blob = drmModeGetPropertyBlob(fd, (uint32_t)(connector->prop_values[prop_i]));
if (hexadecimal)
{
- uint32_t n = size / 2;
+ uint32_t n = (uint32_t)size / 2;
uint32_t i;
rc += blob->length;
if (n < blob->length)
@@ -438,7 +438,7 @@ long blueshift_drm_get_edid(int connection, int connector_index, char* edid, lon
}
else
{
- uint32_t len = blob->length < size ? blob->length : size;
+ uint32_t len = blob->length < size ? blob->length : (uint32_t)size;
memcpy(edid, blob->data, (size_t)len * sizeof(char));
}
drmModeFreePropertyBlob(blob);
diff --git a/src/blueshift_drm_c.h b/src/blueshift_drm_c.h
index e2e3757..527b205 100644
--- a/src/blueshift_drm_c.h
+++ b/src/blueshift_drm_c.h
@@ -101,7 +101,7 @@ void blueshift_drm_close_card(int connection);
* @param connection The identifier for the connection to the card
* @return The number of CRTC:s on the opened card
*/
-int blueshift_drm_crtc_count(int connection);
+int blueshift_drm_crtc_count(int connection) __attribute__((pure));
/**
* Return the number of connectors on the opened card
@@ -109,7 +109,7 @@ int blueshift_drm_crtc_count(int connection);
* @param connection The identifier for the connection to the card
* @return The number of connectors on the opened card
*/
-int blueshift_drm_connector_count(int connection);
+int blueshift_drm_connector_count(int connection) __attribute__((pure));
/**
* Return the size of the gamma ramps on a CRTC
@@ -169,7 +169,7 @@ void blueshift_drm_close_connector(int connection, int connector_index);
* @param connector_index The index of the connector
* @return The physical width of the monitor in millimetres, 0 if unknown or not connected
*/
-int blueshift_drm_get_width(int connection, int connector_index);
+int blueshift_drm_get_width(int connection, int connector_index) __attribute__((pure));
/**
* Get the physical height the monitor connected to a connector
@@ -178,7 +178,7 @@ int blueshift_drm_get_width(int connection, int connector_index);
* @param connector_index The index of the connector
* @return The physical height of the monitor in millimetres, 0 if unknown or not connected
*/
-int blueshift_drm_get_height(int connection, int connector_index);
+int blueshift_drm_get_height(int connection, int connector_index) __attribute__((pure));
/**
* Get whether a monitor is connected to a connector
@@ -187,7 +187,7 @@ int blueshift_drm_get_height(int connection, int connector_index);
* @param connector_index The index of the connector
* @return 1 if there is a connection, 0 otherwise, -1 if unknown
*/
-int blueshift_drm_is_connected(int connection, int connector_index);
+int blueshift_drm_is_connected(int connection, int connector_index) __attribute__((pure));
/**
* Get the index of the CRTC of the monitor connected to a connector
@@ -205,7 +205,7 @@ int blueshift_drm_get_crtc(int connection, int connector_index);
* @param connector_index The index of the connector
* @return The connector type by index, 0 for unknown
*/
-int blueshift_drm_get_connector_type_index(int connection, int connector_index);
+int blueshift_drm_get_connector_type_index(int connection, int connector_index) __attribute__((pure));
/**
* Get the name of the type of a connector
@@ -215,7 +215,7 @@ int blueshift_drm_get_connector_type_index(int connection, int connector_index);
* @return The connector type by name, "Unknown" if not identifiable,
* "Unrecognised" if Blueshift does not recognise it.
*/
-const char* blueshift_drm_get_connector_type_name(int connection, int connector_index);
+const char* blueshift_drm_get_connector_type_name(int connection, int connector_index) __attribute__((pure));
/**
* Get the extended display identification data for the monitor connected to a connector
diff --git a/src/blueshift_iccprofile.c b/src/blueshift_iccprofile.c
index 689a2da..99d5c42 100644
--- a/src/blueshift_iccprofile.c
+++ b/src/blueshift_iccprofile.c
@@ -42,11 +42,11 @@ static xcb_generic_error_t* error;
* @param argv Command line arguments
* @return Zero on success
*/
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wstack-protector"
-int main(int argc, char** argv)
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wstack-protector"
+int main(int argc, char **argv)
{
-#pragma GCC diagnostic pop
+ #pragma GCC diagnostic pop
char* display = NULL;
xcb_screen_iterator_t iter;
int screen_count;
@@ -128,7 +128,7 @@ int main(int argc, char** argv)
xcb_get_atom_name_reply_t* name_reply;
char* name;
char* name_;
- size_t len;
+ uint32_t len;
xcb_get_property_cookie_t prop_cookie;
xcb_get_property_reply_t* prop_reply;
int monitor;
@@ -154,7 +154,7 @@ int main(int argc, char** argv)
/* Extract the atom name from the data structure that holds it. */
name_ = xcb_get_atom_name_name(name_reply);
/* As well as the length of the name; it is not NUL-termianted.*/
- len = (size_t)xcb_get_atom_name_name_length(name_reply);
+ len = (uint32_t)xcb_get_atom_name_name_length(name_reply);
/* NUL-terminate the atom name, */
name = alloca((len + 1U) * sizeof(char));
diff --git a/src/blueshift_idcrtc.c b/src/blueshift_idcrtc.c
index 3979bf5..6bb0fff 100644
--- a/src/blueshift_idcrtc.c
+++ b/src/blueshift_idcrtc.c
@@ -28,12 +28,12 @@
/**
* The major version of RANDR the program expects
*/
-#define RANDR_VERSION_MAJOR 1U
+#define RANDR_VERSION_MAJOR 1
/**
* The minor version of RANDR the program expects
*/
-#define RANDR_VERSION_MINOR 3U
+#define RANDR_VERSION_MINOR 3
@@ -56,11 +56,11 @@ static xcb_generic_error_t* error;
* @param argv Command line arguments
* @return Zero on success
*/
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wstack-protector"
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wstack-protector"
int main(int argc, char** argv)
{
-#pragma GCC diagnostic pop
+ #pragma GCC diagnostic pop
char* display = NULL;
xcb_randr_query_version_cookie_t version_cookie;
xcb_randr_query_version_reply_t* randr_version;
diff --git a/src/blueshift_randr_c.c b/src/blueshift_randr_c.c
index 23035a3..0e38afc 100644
--- a/src/blueshift_randr_c.c
+++ b/src/blueshift_randr_c.c
@@ -201,11 +201,25 @@ uint16_t* blueshift_randr_read(int use_crtc)
G_size = xcb_randr_get_crtc_gamma_green_length(gamma_get_reply);
B_size = xcb_randr_get_crtc_gamma_blue_length(gamma_get_reply);
+ if ((R_size < 2) || (G_size < 2) || (B_size < 2))
+ {
+ fprintf(stderr, "RandR CRTC gamma query returned impossibly small ramps\n");
+ xcb_disconnect(connection);
+ return NULL;
+ }
+
+ if ((R_size | G_size | B_size) > UINT16_MAX)
+ {
+ fprintf(stderr, "RandR CRTC gamma query returned unexpectedly large ramps\n");
+ xcb_disconnect(connection);
+ return NULL;
+ }
+
R_gamma = xcb_randr_get_crtc_gamma_red(gamma_get_reply);
G_gamma = xcb_randr_get_crtc_gamma_green(gamma_get_reply);
B_gamma = xcb_randr_get_crtc_gamma_blue(gamma_get_reply);
- r_gamma = malloc((3U + (size_t)R_size + (size_t)G_size + (size_t)B_size) * sizeof(uint16_t));
+ r_gamma = malloc((3 + (size_t)R_size + (size_t)G_size + (size_t)B_size) * sizeof(uint16_t));
g_gamma = r_gamma + R_size + 1;
b_gamma = g_gamma + G_size + 1;
if (r_gamma == NULL)
@@ -216,9 +230,9 @@ uint16_t* blueshift_randr_read(int use_crtc)
return NULL;
}
- *r_gamma++ = R_size;
- *g_gamma++ = G_size;
- *b_gamma++ = B_size;
+ *r_gamma++ = (uint16_t)R_size;
+ *g_gamma++ = (uint16_t)G_size;
+ *b_gamma++ = (uint16_t)B_size;
for (i = 0; i < R_size; i++) *(r_gamma + i) = *(R_gamma + i);
for (i = 0; i < G_size; i++) *(g_gamma + i) = *(G_gamma + i);
diff --git a/src/blueshift_randr_c.h b/src/blueshift_randr_c.h
index 8ab21f3..2bc23f2 100644
--- a/src/blueshift_randr_c.h
+++ b/src/blueshift_randr_c.h
@@ -30,12 +30,12 @@
/**
* The major version of RandR the program expects
*/
-#define RANDR_VERSION_MAJOR 1U
+#define RANDR_VERSION_MAJOR 1
/**
* The minor version of RandR the program expects
*/
-#define RANDR_VERSION_MINOR 3U
+#define RANDR_VERSION_MINOR 3
@@ -47,7 +47,7 @@ typedef struct blueshift_randr_crtc
/**
* Size of colour curves on the X-axis
*/
- unsigned int curve_size;
+ uint16_t curve_size;
/**
* CRT controller