I tried once again and found that it is more an issue of the size specified when clearing the buffer than when creating it. Here I paste your modified code which doesn't work for me.
unsigned int bo[8];
unsigned char data[32 * 16];
glGenBuffers(8, bo);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, bo[0]);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, bo[0]);
glBufferData(GL_SHADER_STORAGE_BUFFER, 32 * 16, &data[0], GL_DYNAMIC_COPY);
glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, 12, &data[0]);
checkGLError("GetBufferSubData");
glClearBufferSubData(GL_SHADER_STORAGE_BUFFER, GL_RGB32UI, 0, 12, GL_RGB_INTEGER, GL_UNSIGNED_INT, 0); // Works when using size 16 instead of 12, but 3 * 4 = 12
checkGLError("ClearBufferSubData");
glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, 12, &data[0]);
checkGLError("GetBufferSubData");
The code reports INVALID_VALUE error after the ClearBufferSubData call.
Please, check my code again. If needed, I can send you a whole project for MSVC 2012 (using Freeglut and GLEW), it is only a simple test suite for the case.
Thank you in advance!