In my case, I have a series of syntax rules defined to make such things easy to spot.
highlight ImproperSyntax ctermbg=red guibg=red
au BufWinEnter * syn match ImproperSyntax /\s\+$\| \+\ze\t/ "Spaces at the end of lines or BEFORE tabs
au Filetype cpp,c syn keyword ImproperSyntax dynamic_cast "disallowed keyword
au Filetype cpp,c syn match ImproperSyntax /[^\n]\%$/ display "Last line should be blank
au Filetype cpp,c syn match ImproperSyntax /\t/ display "No tabs!
au Filetype cpp,c syn match ImproperSyntax /,\S/ display "comma always has a space
au Filetype cpp,c syn match ImproperSyntax /\%80v.*$/ "Highlight any characters passed column 80
An additional trick you can use is to incorporate all of these into a function (or list/dictionary), and display them as an error either on the statusline (my preference), or to the user as an error.
Regarding checking into CVS... I'm not sure about CVS, but SVN and hg (and presumably most other version control systems) can be instructed to execute a series of 'pre-commit hooks', before allowing you to commit. One of those could easily be programmed to scan for this same behavior (possibly with some sort of override symbol as well).