Page MenuHomePhabricator

Check and test all decimal number parsing and output code for locale issues
Closed, ResolvedPublic

Assigned To
None
Authored By
nolden
Sep 12 2009, 1:23 PM
Referenced Files
F319: sstream_unique.txt
Jan 19 2011, 2:00 PM
F318: fstream_unique.txt
Jan 19 2011, 2:00 PM
F317: printf.txt
Feb 24 2010, 10:03 PM
F316: scanf.txt
Feb 24 2010, 10:00 PM

Description

Floating point numbers in german locale have a different usage of "." and ",", compared to US or other locales. scanf and the c++ stream operators use the locale when parsing decimal numbers, this can lead to critical errors. See T2473.

Related Objects

StatusAssignedTask
ResolvedNone
DuplicateNone
ResolvedNone
ResolvedNone
ResolvedNone
ResolvedNone
ResolvedNone
DuplicateNone
ResolvedNone
WontfixNone
WontfixNone
WontfixNone
ResolvedNone
ResolvedNone
WontfixNone
ResolvedNone
ResolvedNone
ResolvedNone

Event Timeline

There are a very large number of changes, so older changes are hidden. Show Older Changes

Files containing fstream

Files containing sstream

A possible default bug note, providing a suggestion how to implement it, could be along the lines of:

In an effort to make mitk locale independent we have taken a look at the following files:

It seems, that floats are written to a stream or gotten from a stream without specifying the used locale. This can lead to problems if a file is written on a system with e.g. german locale and read on a system with an english locale or vice versa. To prevent this kind of problematic behaviour it is suggested to specify the locale used.

This can be done similar to the following code snippet:

// ... create stream here

// define standard locale
std::locale C("C");

get previous locale of the stream and save it
(especially important in case of cout and cin)
std::locale originalLocale = stream.getloc();

// switch the stream to standard locale
stream.imbue(C);

// ... write your data to file here

// switch back to the previous locale

stream.imbue( originalLocale )

Remember to take care of possible exceptions, by switching back to the original locale [ stream.imbue( originalLocale ) ] within the exception handling.

Expanded default message to encompass hints how to do this using printf and sprintf

In an effort to make mitk locale independent we have taken a look at the
following files:

It seems, that floats are written to a stream or gotten from a stream without
specifying the used locale. This can lead to problems if a file is written on a
system with e.g. german locale and read on a system with an english locale or
vice versa. To prevent this kind of problematic behaviour it is suggested to
specify the locale used.

This can be done similar to the following code snippet:
[code - streams]
// ... create stream here

// define standard locale
std::locale C("C");

get previous locale of the stream and save it
(especially important in case of cout and cin)
std::locale originalLocale = stream.getloc();

// switch the stream to standard locale
stream.imbue(C);

// ... write your data to file here

// switch back to the previous locale
stream.imbue( originalLocale );

[/code - streams]

Remember to take care of possible exceptions, by switching back to the original
locale [ stream.imbue( originalLocale ) ] within the exception handling.

[code - printf]
#include <stdio.h>
#include <locale.h>

int main( void )
{

//... other code

//save old locale
char * oldLocale;
oldLocale = setlocale( LC_ALL, 0 );

//set new locale
setlocale( LC_ALL, "C" );

//... other code using printf or sprintf to print

//restore locale
setlocale( LC_ALL, oldLocale );

//... other code

}
[/code - printf]

franza closed subtask Restricted Maniphest Task as Wontfix.Feb 27 2017, 10:10 AM
kislinsk reopened subtask Restricted Maniphest Task as Open.Jun 27 2018, 3:02 PM
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.
kislinsk reopened subtask Restricted Maniphest Task as Open.Jun 27 2018, 3:05 PM
kislinsk closed subtask Restricted Maniphest Task as Resolved.Jun 27 2018, 3:28 PM
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.
kislinsk closed subtask Restricted Maniphest Task as Resolved.Jun 27 2018, 3:31 PM